2017-07-07 1 views
0

J'ai 4 fichiers CSV avec une colonne. Chaque colonne représente une partie d'un nom (4 parties):Python3 Pandas - Comment créer toutes les combinaisons de 4 colonnes et les écrire en lignes dans un fichier CSV?

CSV 1:

first_name 
michael 
madonna 
steve 
albert 

CSV 2:

second_name 
luke 
han 
kurt 

CSV 3:

first_last_name 
jackson 
jobs 
skywalker 

CSV 4:

second_last_name 
solo 
cobain 
einstein 

Le résultat final que je veux est d'obtenir toutes les combinaisons possibles entre toutes les 4 colonnes (4 SCCV):

first_name,second_name,first_last_name,second_last_name 
michael,luke,jackson,solo 
michael,luke,jackson,cobain 
michael,luke,jackson,einstein 
michael,luke,jobs,solo 
michael,luke,jobs,cobain 
michael,luke,jobs,einstein 
michael,luke,skywalker,solo 
michael,luke,skywalker,cobain 
michael,luke,skywalker,einstein 
... 

Avec pandas géants je me suis converti chaque CSV dans un dataframe mais je n'ai aucune idée de la façon de combiner les quatre. Comment puis-je atteindre cet objectif?

Répondre

0

Utilisez itertools.product pour le levage de charges lourdes.

import pandas as pd 
from itertools import product 

lists = [list(pd.read_csv('data{}.csv'.format(i), header=0).iloc[:,0]) for i in range(1,5)] 
combined = list(','.join(items) for items in product(*lists)) 
pd.DataFrame(combined).to_csv('combined.csv', index=0) 

Si vous voulez juste la forme de liste, utilisez combined. Il ressemble à:

['michael,luke,jackson,solo', 
'michael,luke,jackson,cobain', 
'michael,luke,jackson,einstein', 
'michael,luke,jobs,solo', 
'michael,luke,jobs,cobain', 
'michael,luke,jobs,einstein', 
'michael,luke,skywalker,solo', 
'michael,luke,skywalker,cobain', 
'michael,luke,skywalker,einstein', 
... 

Ou la ligne finale écrit les valeurs combinées sur un CSV.

2
import numpy as np 
import pandas as pd 
import itertools 
import functools 

def cartesian(df1, df2): 
    rows = itertools.product(df1.iterrows(), df2.iterrows())  
    df = pd.DataFrame(left.append(right) for (_, left), (_, right) in rows) 
    return df.reset_index(drop=True) 

df1 = pd.read_csv('first_name.csv') 
df2 = pd.read_csv('second_name.csv') 
df3 = pd.read_csv('first_last_name.csv') 
df4 = pd.read_csv('second_last_name.csv') 

combined = functools.reduce(cartesian, [df1, df2, df3, df4]) 
combined.to_csv('combined.csv')