大Pandas、Python的Groupby和转座

2024-09-28 16:22:18 发布

您现在位置:Python中文网/ 问答频道 /正文

数据帧有

ID  col  col2   col3   col4

1   A    50      S      1
1   A    52      M      4
1   B    45      N      8
1   C    18      S      7

需要数据帧

^{pr2}$

我想要一行每唯一的ID+col(groupbyid和col)。 如果每个ID+col有多个条目(max可以是2,不能更多),那么将col2的第一个值放在colA中,第二个值放在colB中,col3的第一个值放在colC中,第二个值放在colF中,col4的第一个值放在colF中。如果每个ID+col只有一个条目,那么对于col2,将值放入colA,colB为null等

我试着先创建一个计数器:

df['COUNT'] = df.groupby(['ID','col']).cumcount()+1

从这里开始我想增加一个专栏

if count=1 then df['colA']=df.col2
if count=2 then df['colB']=df.col2

。。但这仍然会产生与原始df相同的行数。在


Tags: 数据iddfifcount条目colcol2
3条回答

不确定这是否是您要寻找的,但它呈现的结果与您正在寻找的结果相同。请注意,我在同一列上使用多个聚合函数,因此使用ravel函数来展平数据帧列。在

import pandas as pd
import numpy as np

df = pd.DataFrame({'ID':[1,1,1,1], 
                  'Col1':['A','A','B','C'],
                 'Col2':[50,52,45,18]})

df = df.groupby(['ID','Col1']).agg({'Col2':['first','last']})
df.columns = ["_".join(x) for x in df.columns.ravel()]
df = df.reset_index()
df['Col2_last'] = np.where(df.Col2_first == df.Col2_last, float('nan'), df.Col2_last)

print(df)

我想需要^{}和{a2}:

df['COUNT'] = df.groupby(['ID','col']).cumcount()+1

df = df.set_index(['ID','col', 'COUNT'])['col2'].unstack().add_prefix('col').reset_index()
print (df)
COUNT  ID col  col1  col2
0       1   A  50.0  52.0
1       1   B  45.0   NaN
2       1   C  18.0   NaN

或者:

^{pr2}$

编辑:

对于多个列,解决方案是否有点改变,因为在列中使用MultiIndex

df['COUNT'] = (df.groupby(['ID','col']).cumcount()+1).astype(str)

#remove col2
df = df.set_index(['ID','col', 'COUNT']).unstack()
#flatten Multiindex
df.columns = df.columns.map('_'.join)
df = df.reset_index()
print (df)
   ID col  col2_1  col2_2 col3_1 col3_2  col4_1  col4_2
0   1   A    50.0    52.0      S      M     1.0     4.0
1   1   B    45.0     NaN      N   None     8.0     NaN
2   1   C    18.0     NaN      S   None     7.0     NaN

您可以将groupbyapply(pd.Series)一起使用

df.groupby(['ID','col']).col2.apply(list).apply(pd.Series).add_prefix('col').reset_index()
Out[404]: 
   ID col  col0  col1
0   1   A  50.0  52.0
1   1   B  45.0   NaN
2   1   C  18.0   NaN

相关问题 更多 >