熊猫列到具有值的行

时间:2020-01-10 02:25:31

标签: python pandas

我有一个熊猫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 :编辑为“预期输出”-我需要每列的总和。
对所有在编辑前已经回答的人表示歉意!

4 个答案:

答案 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