我正在尝试折叠数据框中的行,该数据框包含一列ID数据和多个列,每列包含不同的字符串.它看起来像groupby是解决方案,但似乎倾向于在组上执行一些数字函数 - 我只想保留文本.这就是我所拥有的......
我有一个表格的数据框:
index ID apples pears oranges
0 101 oranges
1 134 apples
2 576 pears
3 837 apples
4 576 oranges
5 134 pears
Run Code Online (Sandbox Code Playgroud)
列是干净的:所以苹果列中只有文本"apples",或者它将是空白的".
如果在同一ID下有多个条目(在本例中,在ID 134和576上),我想将这些行折叠在一起以获得:
index ID apples pears oranges
0 101 oranges
1 134 apples pears
2 576 pears oranges
3 837 apples
Run Code Online (Sandbox Code Playgroud)
我可以通过迭代行来做到这一点,但它似乎是一个非熊猫的解决方案.有没有更好的办法?
jez*_*ael 11
您可以使用groupby聚合''.join,sum或max:
#if blank values are NaN first replace to ''
df = df.fillna('')
df = df.groupby('ID').agg(''.join)
print (df)
apples pears oranges
ID
101 oranges
134 apples pears
576 pears oranges
837 apples
Run Code Online (Sandbox Code Playgroud)
还有效:
df = df.fillna('')
df = df.groupby('ID').sum()
#alternatively max
#df = df.groupby('ID').max()
print (df)
apples pears oranges
ID
101 oranges
134 apples pears
576 pears oranges
837 apples
Run Code Online (Sandbox Code Playgroud)
此外,如果需要删除每组和每列的重复项添加unique:
df = df.groupby('ID').agg(lambda x: ''.join(x.unique()))
Run Code Online (Sandbox Code Playgroud)
假设空白是 ''
选项1
pivot_table
df.pivot_table(['apples', 'pears', 'oranges'], 'ID', aggfunc=''.join)
Run Code Online (Sandbox Code Playgroud)
选项 2
sort并取最后一行,因为''将首先排序
def f(df):
return pd.DataFrame(np.sort(df.values, 0)[[-1]], [df.name], df.columns)
df.set_index(
'ID', append=True
).groupby(level='ID', group_keys=False).apply(f)
Run Code Online (Sandbox Code Playgroud)
两者产量
apples oranges pears
ID
101 oranges
134 apples pears
576 oranges pears
837 apples
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9995 次 |
| 最近记录: |