使用pandas按列合并,平均和组合多个csv

时间:2017-06-23 10:04:06

标签: python csv pandas

我有多个csv文件可供使用,大约20个,这里我举了一些例子

blink.csv

acc mat time win kill deth ast xp gold hero leag opp team 10 4286 123 FALSE 4 4 2 443 414 96 Fr Nb Wg 10 7329 133 FALSE 3 5 5 409 552 58 Fr Nb Wg 10 5557 144 TRUE 8 7 16 630 770 16 Fr FT Wg 10 7149 145 TRUE 7 3 7 602 601 15 Fr FT Wg 10 1034 148 TRUE 9 0 10 535 580 119 Br AA Wg 10 1861 149 TRUE 0 3 11 426 359 46 Br AA Wg

faithbian.csv

acc mat time win kill deth ast xp gold hero leag opp team 13 4286 123 FALSE 1 5 11 455 592 22 Fr Nb Wg 13 7329 133 FALSE 2 7 2 422 159 55 Fr Nb Wg 13 5557 144 TRUE 6 1 12 145 195 99 Fr FT Wg 13 7149 145 TRUE 5 2 1 793 952 5 Fr FT Wg 13 1861 149 TRUE 2 1 12 693 102 11 Br AA Wg

iceice.csv

acc mat time win kill deth ast xp gold hero leag opp team 22 7329 133 FALSE 4 2 22 422 259 15 Fr Nb Wg 22 5557 144 TRUE 6 0 2 145 295 212 Fr FT Wg 22 7149 145 TRUE 1 1 1 793 252 2 Fr FT Wg 22 1034 148 TRUE 1 6 1 204 295 56 Br AA Wg 22 1861 149 TRUE 1 11 12 693 202 21 Br AA Wg

我想到的是合并" acc"和#34;英雄"在一起,按照" mat"并且平均列" kill,deth,ast,xp和gold" 这是我想到的输出

out.csv

acc mat time win kill deth ast xp gold hero leag opp team 10,13 4286 123 FALSE 2.5 4.5 6.5 434.5 503 96,22 Fr Nb Wg 10,13,22 7329 133 FALSE 3 4.6 9.6 422 323 58,55,15 Fr Nb Wg 10,13,22 5557 144 TRUE 6.6 2.6 10 ... ... 16,99,212 Fr FT Wg 10,13,22 7149 145 TRUE .. .. .. ... ... 15,5,2 Fr FT Wg 10,22 1034 148 TRUE .. .. .. ... ... 119,26,56 Br AA Wg 10,13,22 1861 149 TRUE .. .. .. ... ... 46,11,21 Br AA Wg

我尝试使用此代码,但它没有提供我想要的输出..

import pandas as pd
blink = pd.read_csv('blink.csv',keep_default_na=False,na_values=[""])
faithbian = pd.read_csv('faithbian.csv',keep_default_na=False,na_values=[""])
iceice = pd.read_csv('iceice.csv',keep_default_na=False,na_values=[""])

df = pd.concat([blink,faithbian,iceice],axis=0)
con_df = pd.concat([df.groupby(['mat'])['acc','hero'].apply(lambda x: "%s" % ','.join(x.astype(str))),df.groupby(['mat'])['kill','deth','ast','xp','gold'].mean()],axis=1)
con_df.to_csv('out.csv')

删除" leag"," opp"," team"列而不是合并" acc"和#34;英雄",它给了" acc,hero"在第一列中的所有行

任何人都可以帮我实现所需的真实输出吗? 感谢。

1 个答案:

答案 0 :(得分:0)

您可以使用groupby.agg

agg_dict = {
    'acc': lambda x: "%s" % ','.join(x.astype(str)),
    'hero': lambda x: "%s" % ','.join(x.astype(str)),
    'kill': 'mean',
    'deth': 'mean',
    'ast': 'mean',
    'xp': 'mean',
    'gold': 'mean',
}
agg_df = df.groupby('mat').agg(agg_dict)

然后将其与包含唯一['mat', 'time', 'win', 'leag', 'opp', 'team']

的DataFrame结合使用
mat_df = df[['mat', 'time', 'win', 'leag', 'opp', 'team']].drop_duplicates()

con_df = pd.merge(agg_df, mat_df, left_index=True, right_on='mat').reindex(df.index)