我有一个熊猫DataFrame df
,就像-
fileName obj1 obj2 obj3 obj4
file_01.jpg 1 1 1
file_02.jpg 1 1
file_03.jpg 1 2 1
预期输出:
variable value
obj1 2
obj2 4
obj3 2
obj4 1
我尝试了什么?
df.melt(value_vars=df.columns).groupby(['variable']).count()
接收到的输出:
variable value
fileName 3
obj1 3
obj2 3
obj3 3
obj4 3
我也尝试使用.pivot
和.groupby
,但无法获得预期的结果。
EDIT :编辑为“预期输出”-我需要每列的总和。
对所有在编辑前已经回答的人表示歉意!
答案 0 :(得分:2)
您可以使用按列求和:
(
df.set_index('fileName')
.sum(0)
.to_frame('value')
.rename_axis('variable')
.reset_index()
)
variable value
0 obj1 2
1 obj2 4
2 obj3 2
3 obj4 1
答案 1 :(得分:1)
输入数据:
inputdf = pd.DataFrame({'obj1': [1,np.nan, 1], 'obj2': [1,1,2], 'obj3': [1,1,np.nan], 'obj4': [np.nan, np.nan, 1]})
解决方案:
>>> inputdf.sum()
obj1 2.0
obj2 4.0
obj3 2.0
obj4 1.0
答案 2 :(得分:0)
您可以使用filter来过滤需要结果的列,然后对这些列执行count
。
df[df.filter(like='obj').columns].count().reset_index().rename(columns = {'index':'variable', 0 : 'value'})
输出
variable value
0 obj1 2
1 obj2 3
2 obj3 2
3 obj4 1
答案 3 :(得分:0)
“一个衬里”(可能有点令人费解):
(
df[[i for i in df.columns if 'obj' in i]]
.stack()
.to_frame()
.reset_index()
.drop('level_0', axis=1)
.rename(columns={'level_1':'variable', 0:'value',})
.groupby('variable')
.sum()
.reset_index()
)
输出:
variable value
0 obj1 2
1 obj2 4
2 obj3 2
3 obj4 1