![](/img/trans.png)
[英]Merge all the csv file in one folder and add a new column to pandas dataframe with partial file name in Python
[英]Merge multiple CSV into one DataFrame with filename as column name
我想合並一個目錄中的許多txt文件。以下是名為df_A,df_B和df_c的三個文件的示例:
df_A
0 1 2
0 James 1 yes
1 Jake 3 No
2 Jane 2 Yes
df_B
0 1 2
0 Jane 2 No
1 Job 6 No
2 James 1 Yes
df_C
0 1 2
0 Jack 4 No
1 Jenny 7 Yes
2 James 1 No
3 John 9 Yes
我希望最終的數據幀看起來像這樣:
ID Name df_A df_B df_C
1 James Yes Yes No
3 Jake No NA NA
2 Jane Yes No NA
6 Job NA Yes NA
4 Jack NA NA No
7 Jenny NA NA Yes
9 John NA NA Yes
這是我到目前為止的代碼...
new_df = pd.DataFrame(columns = ['Name', 'ID'])
for filename in os.listdir('/path'):
if filename.endswith('.txt'):
course = os.path.splitext(filename)[0]
new_df = pd.concat([combined_df,pd.DataFrame(columns=[course])])
data = pd.read_csv(filename, sep="\t", header=None)
for i in data[data.columns[1]]:
if i not in new_df['ID']:
new_df['ID'].append(i)
對於這三個數據框,只需分配列名。 最后一列應該是唯一的。 然后,調用pd.concat
+ groupby
作為輸出。
dfA.columns = ['Name', 'ID', 'df_A']
dfB.columns = ['Name', 'ID', 'df_B']
dfC.columns = ['Name', 'ID', 'df_C']
pd.concat([dfA, dfB, df3])\
.groupby('Name', as_index=False, sort=False).first()\
.set_index('ID').fillna('')
Name df_A df_B df_C
ID
1 James yes Yes No
3 Jake No
2 Jane Yes No
6 Job No
4 Jack No
7 Jenny Yes
9 John Yes
通常,假設您有df_list
。 然后,您可以在循環中分配列名稱。
df_list = [dfA, dfB, dfC, ...]
for i, df in enumerate(df_list):
df.columns = ['Name', 'ID', 'df_{}'.format(chr(ord('A') + i))]
pd.concat(df_list).groupby('Name',
as_index=False, sort=False).first().set_index('ID')
import os
import pandas as pd
combinedDF = pd.DataFrame(columns=['Name','ID'])
for filename in os.listdir(os.getcwd()):
if filename.endswith('.txt'):
df = pd.read_csv(filename, header=None, delimiter=' ')
df.columns=['Name','ID',filename[:-4]]
combinedDF = combinedDF.merge(df, on=['Name', 'ID'], how='outer')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.