如果第一行ID相同,Python pandas将第二行组合在一起

时间:2015-12-29 03:57:51

标签: python-2.7 pandas

我们正在使用Python 2.7

我们在下面有一个简单的表格:

import pandas as pd
import numpy as np
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo polar bear'.split(),
               'B': '1 1 2 3 2 2 1 3 4 5'.split()})
print(df)

生成

       A  B
0    foo  1
1    bar  1
2    foo  2
3    bar  3
4    foo  2
5    bar  2
6    foo  1
7    foo  3

是否有任何Pandas方式可以匹配ID列中的A?例如,如果列ID中的A相同,则将第二行连接到字典或列表中。例如:

{'foo,12213','bar,132'}

谢谢!

2 个答案:

答案 0 :(得分:1)

你想要的输出有点模糊 - 你提到字典和列表,然后给出一个包含字符串的集合 - 但如果你只关心匹配的信息而不是它所在的格式,那么IIUC,你可以使用{ {1}}。如果B由字符串组成(就像在示例框架中那样),那么很简单:

groupby

如果B由整数组成,我们必须将它们转换为字符串,可能使用

之类的东西
>>> df.groupby("A")["B"].sum()
A
bar        132
bear         5
foo      12213
polar        4
Name: B, dtype: object
>>> dict(df.groupby("A")["B"].sum())
{'polar': '4', 'bar': '132', 'foo': '12213', 'bear': '5'}

我建议您阅读split-apply-combine pattern上的文档。

答案 1 :(得分:1)

你可以通过聚合来列出并加入列表,如下所示。

df
Out[7]: 
     A  B
0  foo  1
1  bar  1
2  foo  2
3  bar  3
4  foo  2
5  bar  2
6  foo  1
7  foo  3

df.groupby("A")["B"].apply(list)
Out[10]: 
A
bar          [1, 3, 2]
foo    [1, 2, 2, 1, 3]

new_df = df.groupby("A")["B"].apply(list).reset_index()

new_df['B'] = new_df['B'].map(lambda x: ''.join([str(i) for i in x]))

     A      B
0  bar    132
1  foo  12213

new_df.set_index("A").to_dict()
Out[34]: {'B': {'bar': '132', 'foo': '12213'}}