Mam 12 plików CSV, które próbuję skonsolidować do jednego pliku CSV. W tych 12 plikach znajduje się jedna kolumna, SendID, która jest w każdym z tych plików. SendID jest wyjątkowy i nie powinien być powielany na końcowym połączeniu pliku CSV. Na przykład cztery moje pliki 12 CSV mają te kolumny.

(File 1: A,B,C,D,E), (File 2: A,C,F,H,K), (File 3: A,B,D,H,L), (File 4: A,D,H,N,Q)

Tak więc kolumna A jest obecna w każdym pliku CSV i działa jako unikalna kolumna identyfikacyjna lub klucz podstawowy, który nie powinien powtarzać się w końcowym pliku CSV. Istnieją również przypadki, w których ta sama kolumna może pojawić się w wielu plikach CSV, kolumny te przenosi tę samą wartość w każdym pliku, jeśli są one połączone tymi samym SendID (lub kolumna A, jak wymieniono w powyższym przykładzie)

Pliki mogą również mieć różne kolumny, które są obecne tylko w pojedynczym pliku CSV i nie występują w żadnym innym pliku, ponownie, ta kolumna byłaby dołączona do ostatecznego rzędu kruszywa na kolumnie Kluczowej {X0}}. Może być również niektóre wiersze w kolumnie, które nie posiadają wartości dla każdego rekordu SendID w wielu plikach CSV. Więc jeden wiersz, na podstawie unikalnego SendID może mieć wartość dla kolumny K, ale nie kolumna Q. W takim przypadku wartość kolumny q byłaby wówczas zerowy lub pusty dla tego rekordu.

Jak mogę użyć Pythona i Pandas, aby przekształcić te 12 plików CSV w jednym końcowym pliku CSV, który będzie zawierać duplikaty SendID rekordy? Chociaż także możliwość dołączenia wszystkich różnych kolumn na różnych plikach do klucza podstawowego SendID, tworząc jeden zagregowany rząd na unikalny {X2}} Record i oczywiście nie tworzenie duplikatów tej samej kolumny, która może się pojawić Wiele plików CSV. Przepraszam z góry, jak wiem, to jest nieco pełne, ale nadal jestem bardzo nowy w Pythonie i próbuję nauczyć się tak bardzo, jak tylko mogę.

0
randomguy2443 20 styczeń 2021, 09:34

2 odpowiedzi

Najlepsza odpowiedź

Załóżmy, że masz tę ramkę danych

import pandas as pd

df1 = pd.DataFrame([{'A':'1', 'B':'2'}])
df2 = pd.DataFrame([{'A':'1', 'C':'3'}, {'A':'2', 'C':'4'}])

Teraz, jeśli chcesz połączyć te dwa na podstawie kolumny A.E Wendid, możesz zrobić coś takiego

df1.merge(df2, on='A', how='outer').drop_duplicates()

Spowoduje to, że połączonego pliku;

enter image description here

Więc nie będzie zawierać duplikatów rekordów. Ponadto dołącz różne kolumny z tym samym kluczem podstawowym tworzącym unikalny rekord.

2
Muhammad Junaid Haris 20 styczeń 2021, 06:51
df1 = pd.DataFrame(columns=list('ABCDE'))
df2 = pd.DataFrame(columns=list('ACFHK'))
df3 = pd.DataFrame(columns=list('ABDHL'))
df4 = pd.DataFrame(columns=list('ADHNQ'))


df_list = [df1, df2, df3, df4]
# rename every column with subfix _1, _2, _3, _4, except the uniqueID row 'A'
for i, df in enumerate(df_list):
    subfix = i+1
    df.columns = ['A'] + (df.columns[1:] + '_%s' % subfix).tolist()

# outer merge every df, on uniqueID row 'A'
dfn = df_list[0]
for df in df_list[1:]:
    dfn = pd.merge(dfn, df, on='A', how='outer')


# find the same column name dict
obj_col = pd.Series(dfn.columns).to_frame()
obj_col['col'] = obj_col[0].str.rsplit('_', 1).str[0]

# remove the uniqueID row
cond = obj_col['col'] == 'A'
obj_col = obj_col[~cond]
obj_col = obj_col.groupby('col')[0].agg(list)
col_dict = obj_col.to_dict()
col_dict

# {'B': ['B_1', 'B_3'],
#  'C': ['C_1', 'C_2'],
#  'D': ['D_1', 'D_3', 'D_4'],
#  'E': ['E_1'],
#  'F': ['F_2'],
#  'H': ['H_2', 'H_3', 'H_4'],
#  'K': ['K_2'],
#  'L': ['L_3'],
#  'N': ['N_4'],
#  'Q': ['Q_4']}

# combine the same column's content with combine_first
for col, colums in col_dict.items():
    dfn[col] = dfn[colums[0]]
    for i in colums[1:]:
        dfn[col] = dfn[col].combine_first(dfn[i])

# result
cols = ['A'] + list(col_dict.keys())
result = dfn[cols].copy()
0
Ferris 20 styczeń 2021, 07:07