我有以下数据框,
>>> data = pd.DataFrame({'Name': ['CTA15', 'CTA15', 'AC007', 'AC007', 'AC007'],
'ID': [22, 22, 2, 2, 2],
'Sample':['PE12', 'PL14', 'AE29', 'AE04', 'PE03'],
'count_col' : [2, 2, 3, 3, 3]})
>>> data
ID Name Sample count_col
0 22 CTA15 PE12 2
1 22 CTA15 PL14 2
2 2 AC007 AE29 3
3 2 AC007 AE04 3
4 2 AC007 PE03 3
我需要重新排列我的数据框,如下所示,
Name Sample count_col
CTA15 PE12 2
PL14
AC007 AE10 3
AE29
PE03
我尝试的是,
pd.pivot_table(All_variants_REL,index=["Name",'Sample'],
values=['Count'],aggfunc={'Name':np.size})
但它没有显示计数列中的准确计数 任何帮助都会很棒..
答案 0 :(得分:2)
mask
创建的布尔掩码似乎需要astype
+ duplicated
:
注意:我将强制转换添加到str
,因为在count
列中获取混合值(带有整数的字符串),并且可以破坏一些pandas函数。
Notice1 - 解决方案有效,如果Name
列中的值已排序。
cols = ['Name','count']
df[cols] = df[cols].astype(str).mask(df.duplicated(['Name']), '')
print (df)
Name ID Sample count
0 CTA15 22 PE12 2
1 22 PL14
2 AC007 2 AE29 3
3 2 AE04
4 2 PE03
如果需要NaNs
,只需省略,
- 但最后一列值会转换为float
(因为NaN
是浮动的)
cols = ['Name','count']
df[cols] = df[cols].mask(df.duplicated(['Name']))
print (df)
Name ID Sample count
0 CTA15 22 PE12 2.0
1 NaN 22 PL14 NaN
2 AC007 2 AE29 3.0
3 NaN 2 AE04 NaN
4 NaN 2 PE03 NaN
可以使用lists
:
cols = ['Name','count', 'ID']
df = df.groupby(cols)['Sample'].apply(list).reset_index()
print (df)
Name count ID Sample
0 AC007 3 2 [AE29, AE04, PE03]
1 CTA15 2 22 [PE12, PL14]
答案 1 :(得分:1)
为什么不简单地设置多指数?如果您的列数多于示例DataFrame
中的列数,则这样做会转换为显示所有列。
>>> data = pd.DataFrame({'Name': ['CTA15', 'CTA15', 'AC007', 'AC007', 'AC007'],
'ID': [22, 22, 2, 2, 2],
'Sample':['PE12', 'PL14', 'AE29', 'AE04', 'PE03'],
'count_col' : [2, 2, 3, 3, 3]})
(附注:我不建议使用名称为count
的列,因为它是DataFrame
方法,并且会引发问题。例如,{{1} }并没有像我们预期的那样返回data.count
。)
Series
设置多索引,它将作为任意大>>> data
ID Name Sample count_col
0 22 CTA15 PE12 2
1 22 CTA15 PL14 2
2 2 AC007 AE29 3
3 2 AC007 AE04 3
4 2 AC007 PE03 3
的解决方案。
DataFrame