【问题标题】:python pandas index of ones (1s) at row-wise逐行的python pandas索引(1s)
【发布时间】:2020-07-01 13:26:12
【问题描述】:

从 Pandas Dataframe 中,如何获取所有行级别的索引?

我的数据框有大约一百列。这是一个例子:

    a    b     c    d
0   1    0     1    0
1   0    0     0    1
2   1    1     0    1
3   1    1     0    0
4   1    1     1    1

预期的结果是

0   a,c
1   d
2   a,b,d
3   a,b
4   a,b,c,d

我在 stackoverflow 上发现了这个问题 index of non "NaN" values in Pandas 但它适用于列级别

提前致谢。

【问题讨论】:

  • 您的问题标题显示了NaN,但您的示例中没有NaN
  • 抱歉给您带来了困惑。我只是认为 0 对我来说是 NaN。
  • 我更正了标题

标签: python pandas


【解决方案1】:

如果只有10 值使用DataFrame.dot 与列名和分隔符进行矩阵乘法,最后使用Series.str.rstrip 删除分隔符:

df['e'] = df.dot(df.columns + ', ').str.rstrip(', ')
#if exist another values like 0,1 and compare 1
#df['e'] = df.eq(1).dot(df.columns + ', ').str.rstrip(', ')
print (df)
   a  b  c  d           e
0  1  0  1  0        a, c
1  0  0  0  1           d
2  1  1  0  1     a, b, d
3  1  1  0  0        a, b
4  1  1  1  1  a, b, c, d

也供Series使用:

s = df.dot(df.columns + ', ').str.rstrip(', ')
print (s)
0          a, c
1             d
2       a, b, d
3          a, b
4    a, b, c, d
dtype: object

【讨论】:

  • 它给了我一个内存错误结果。有没有办法解决这个问题?
  • 列数为152
  • 感谢它现在有效。看来我的其中一列有一些问题。我删除了该列
【解决方案2】:

试试:

df=df.stack()
df=df.loc[df.eq(1)].reset_index(level=1).groupby(level=0).agg(', '.join)

输出:

      level_1
0        a, c
1           d
2     a, b, d
3        a, b
4  a, b, c, d

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-08
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 2013-11-15
    • 2020-06-12
    • 2016-08-16
    相关资源
    最近更新 更多