alo*_*v28 6 python merge filter dataframe pandas
我在将DataFrame数组合并到单个DataFrame中时遇到了问题,并在特定列上合并.
我有一个DataFrames列表data,每个元素都被调用,data[i]如下所示:
Rank Name
2400 1 name1
2401 2 name2
2402 3 name3
2403 4 name4
2404 5 name5
Run Code Online (Sandbox Code Playgroud)
每个DataFrame包含给定月份的前5个列表,该列表包含一年的月度结果.
我希望最终的合并DataFrame看起来像这样:
Rank Name_month1 Name_month2 Name_month3 ...
2400 1 name1 name1 name1 ...
2401 2 name2 name2 name2 ...
2402 3 name3 name3 name3 ...
2403 4 name4 name4 name4 ...
2404 5 name5 name5 name5 ...
Run Code Online (Sandbox Code Playgroud)
其中每一列在第一列之后对应于每月排名.
我从列表中合并2个DataFrame没有问题,data:
pandas.merge(data[0], data[1], on='Rank', suffix=['_month1', '_month2'])
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用filter()或链接时.merge,我一直遇到麻烦.
有什么想法吗?谢谢!
问题在于,当您进行第一次合并时,您更改了列的名称(添加后缀),并且在第二次合并时不会发生名称冲突,因此将永远不会使用第二次合并中的后缀.解决方案是在合并后手动重命名列.
In [2]: df
Out[2]: Rank Name
2400 1 name1
2401 2 name2
2402 3 name3
2403 4 name4
2404 5 name5
In [3]: df.merge(
df, on='Rank', suffixes=['_month1', '_month2']
).merge(df, on='Rank').rename(
columns={'Name': 'Name_month3'}
).merge(df, on='Rank').rename(
columns={'Name': 'Name_month4'}
)
Out[3]: Rank Name_month1 Name_month2 Name_month3 Name_month4
0 1 name1 name1 name1 name1
1 2 name2 name2 name2 name2
2 3 name3 name3 name3 name3
3 4 name4 name4 name4 name4
4 5 name5 name5 name5 name5
Run Code Online (Sandbox Code Playgroud)
如果你有一个DataFrames列表,那就做:
In [4]: data = [df, df, df, df]
current = data[0].rename(columns={'Name': 'Name_month1'})
for i, frame in enumerate(data[1:], 2):
current = current.merge(frame, on='Rank').rename(
columns={'Name': 'Name_month%d' % i})
current
Out[4]: Rank Name_month1 Name_month2 Name_month3 Name_month4
0 1 name1 name1 name1 name1
1 2 name2 name2 name2 name2
2 3 name3 name3 name3 name3
3 4 name4 name4 name4 name4
4 5 name5 name5 name5 name5
Run Code Online (Sandbox Code Playgroud)