pandas 数据帧上的 groupby 并分配回原始 df 失败并进行转换
pandas groupby on dataframe and assigning back to orignal df fails with transform
我有以下数据框,列中的某些值重复。
我想按 datafarme
分组
df = pd.DataFrame(
{'Score': [0.65, 0.57, 0.56, 0.689, 0.56, 0.85, 0.45, 0.15, 0.14, 0.4678],
'ID': ['AAA', 'BBB', 'SAS', 'SAP', 'TCS', 'BBB', 'CTC', 'CTC', 'CTC', 'CTC'],
'Sample': ['AE01', 'AE01', 'AE03', 'AE03', 'AE03', 'AE05', 'AE05', 'AE05', 'AE05', 'AE05'],
'Freq': [1, 14, 14, 15, 16, 17, 18, 19, 20, 21],
'Type': ['Non', 'IND', 'IND', 'IND', 'IND', 'IND', 'IND', 'IND', 'IND', 'IND']},
columns=['Sample','ID','Type','Score','Freq'])
当我尝试通过选项将 'Re' 列添加到组中以通过使用 transform
跟随单行将其分配给原始数据帧 df 时
df['Re']=df.drop_duplicates(['Sample','ID']).groupby(['ID']).transform(size)
我收到以下错误,
ValueError: Wrong number of items passed 4, placement implies 1
我知道我可以通过合并来获得按结果分配给组的原始数据帧,但是当我合并时,我得到了某些行,这些行在原始 df 中重复了多次,而我不需要这些行。任何更好的解决方案都会很棒。
谢谢
我认为你需要先分配给 drop_duplicates
的新 DataFrame
输出,因为显然 drop_duplicates
删除了一些重复行(如果存在),所以不能分配新列 Re
到原来的 df
。
另一个问题是需要将 Series
添加到 []
以进行 groupby,因为 transform
仅适用于 Series
。如果使用 size
你可以使用一些不用于分组的列,这里是 ID
.
df = df.drop_duplicates(['Sample','ID'])
df['Re']= df.groupby(['ID'])['Sample'].transform('size')
print (df)
Sample ID Type Score Freq Re
0 AE01 AAA Non 0.650 1 1
1 AE01 BBB IND 0.570 14 2
2 AE03 SAS IND 0.560 14 1
3 AE03 SAP IND 0.689 15 1
4 AE03 TCS IND 0.560 16 1
5 AE05 BBB IND 0.850 17 2
6 AE05 CTC IND 0.450 18 1
df = df.drop_duplicates(['Sample','ID'])
df['Re']= df.groupby(['ID'])['Type'].transform('size')
print (df)
Sample ID Type Score Freq Re
0 AE01 AAA Non 0.650 1 1
1 AE01 BBB IND 0.570 14 2
2 AE03 SAS IND 0.560 14 1
3 AE03 SAP IND 0.689 15 1
4 AE03 TCS IND 0.560 16 1
5 AE05 BBB IND 0.850 17 2
6 AE05 CTC IND 0.450 18 1
如果不赋值,得到NaN
:
df['Re']= df.drop_duplicates(['Sample','ID']).groupby(['ID'])['Sample'].transform('size')
print (df)
Sample ID Type Score Freq Re
0 AE01 AAA Non 0.6500 1 1.0
1 AE01 BBB IND 0.5700 14 2.0
2 AE03 SAS IND 0.5600 14 1.0
3 AE03 SAP IND 0.6890 15 1.0
4 AE03 TCS IND 0.5600 16 1.0
5 AE05 BBB IND 0.8500 17 2.0
6 AE05 CTC IND 0.4500 18 1.0
7 AE05 CTC IND 0.1500 19 NaN
8 AE05 CTC IND 0.1400 20 NaN
9 AE05 CTC IND 0.4678 21 NaN
我有以下数据框,列中的某些值重复。 我想按 datafarme
分组 df = pd.DataFrame(
{'Score': [0.65, 0.57, 0.56, 0.689, 0.56, 0.85, 0.45, 0.15, 0.14, 0.4678],
'ID': ['AAA', 'BBB', 'SAS', 'SAP', 'TCS', 'BBB', 'CTC', 'CTC', 'CTC', 'CTC'],
'Sample': ['AE01', 'AE01', 'AE03', 'AE03', 'AE03', 'AE05', 'AE05', 'AE05', 'AE05', 'AE05'],
'Freq': [1, 14, 14, 15, 16, 17, 18, 19, 20, 21],
'Type': ['Non', 'IND', 'IND', 'IND', 'IND', 'IND', 'IND', 'IND', 'IND', 'IND']},
columns=['Sample','ID','Type','Score','Freq'])
当我尝试通过选项将 'Re' 列添加到组中以通过使用 transform
df['Re']=df.drop_duplicates(['Sample','ID']).groupby(['ID']).transform(size)
我收到以下错误,
ValueError: Wrong number of items passed 4, placement implies 1
我知道我可以通过合并来获得按结果分配给组的原始数据帧,但是当我合并时,我得到了某些行,这些行在原始 df 中重复了多次,而我不需要这些行。任何更好的解决方案都会很棒。 谢谢
我认为你需要先分配给 drop_duplicates
的新 DataFrame
输出,因为显然 drop_duplicates
删除了一些重复行(如果存在),所以不能分配新列 Re
到原来的 df
。
另一个问题是需要将 Series
添加到 []
以进行 groupby,因为 transform
仅适用于 Series
。如果使用 size
你可以使用一些不用于分组的列,这里是 ID
.
df = df.drop_duplicates(['Sample','ID'])
df['Re']= df.groupby(['ID'])['Sample'].transform('size')
print (df)
Sample ID Type Score Freq Re
0 AE01 AAA Non 0.650 1 1
1 AE01 BBB IND 0.570 14 2
2 AE03 SAS IND 0.560 14 1
3 AE03 SAP IND 0.689 15 1
4 AE03 TCS IND 0.560 16 1
5 AE05 BBB IND 0.850 17 2
6 AE05 CTC IND 0.450 18 1
df = df.drop_duplicates(['Sample','ID'])
df['Re']= df.groupby(['ID'])['Type'].transform('size')
print (df)
Sample ID Type Score Freq Re
0 AE01 AAA Non 0.650 1 1
1 AE01 BBB IND 0.570 14 2
2 AE03 SAS IND 0.560 14 1
3 AE03 SAP IND 0.689 15 1
4 AE03 TCS IND 0.560 16 1
5 AE05 BBB IND 0.850 17 2
6 AE05 CTC IND 0.450 18 1
如果不赋值,得到NaN
:
df['Re']= df.drop_duplicates(['Sample','ID']).groupby(['ID'])['Sample'].transform('size')
print (df)
Sample ID Type Score Freq Re
0 AE01 AAA Non 0.6500 1 1.0
1 AE01 BBB IND 0.5700 14 2.0
2 AE03 SAS IND 0.5600 14 1.0
3 AE03 SAP IND 0.6890 15 1.0
4 AE03 TCS IND 0.5600 16 1.0
5 AE05 BBB IND 0.8500 17 2.0
6 AE05 CTC IND 0.4500 18 1.0
7 AE05 CTC IND 0.1500 19 NaN
8 AE05 CTC IND 0.1400 20 NaN
9 AE05 CTC IND 0.4678 21 NaN