python—如何获得在考虑新列时受影响的新索引的数量(计数)

js81xvg6  于 2021-09-29  发布在  Java
关注(0)|答案(2)|浏览(566)

我有下一个问题要解决。
我有一个巨大的 Dataframe (14k行x1600列),由1和0组成。在考虑新列时,我需要获得唯一的新值。意思是,我有索引栏和第一列,如果我考虑第二列,我需要能够获得多少行与第一列不同的“计数”。然后,考虑第三列,并获得不同值的计数,从第一和第二列等。例如,以下数据集:

  1. import pandas as pd
  2. data = [[1, 1, 0], [1, 0, 0], [0, 1, 1], [1, 1, 1], [0, 0, 1]]
  3. df = pd.DataFrame(data, columns=["S1", "S2", "S3"])
  4. df

(1表示存在,0表示不存在,这意味着在第1列中,索引(0)为“已观察到”,在第2列中为“0”,表示未观察到,依此类推)。
因为我不知道如何编写代码,所以我不知道是否更容易在结尾处获得一个新行和新值的计数,或者转置df并获得一个具有这些值的新列。在任何情况下,我期望的输出应该是这样的:

  1. import pandas as pd
  2. data = [[1, 1, 0], [1, 0, 0], [0, 1, 1], [1, 1, 1], [0, 0, 1], [3, 1, 1]]
  3. df_out = pd.DataFrame(data, columns=["S1", "S2", "S3"])
  4. df_out

在这里,您可以看到,只有第1列有3个唯一的索引值对,当我们考虑第1列和第2列时,我们有2个重复值,但有1个新值,当我们添加第三列时,与第1列和第2列相比,我们只有1个新值。。。
所以,为了澄清我自己,请看下图。在此处输入图像描述

对于本例,我需要计算第1列中“1”的总数,然后,当我考虑第2列时,我需要计算案例[0,1],当我考虑第三列时,我需要计算案例[0,0,1],对于第四列,我需要计算案例[0,0,0,1],依此类推。
在这个链接中,您可以下载原始df的一小部分,最后是唯一的“1”(手动获取)
我需要获得整个 Dataframe 的那种输出。
希望有人能帮忙。
谢谢

2g32fytz

2g32fytz1#

您可以使用@Corrarien的解决方案进行一些预处理:

  1. df[~df.sum(axis=1).eq(0)].idxmax(axis=1).value_counts()

或者,或者

  1. df.cumsum(axis=1).cumsum(axis=1).eq(1).sum()
旧答案

您可以使用移位的 Dataframe 和总和计算差值:

  1. df2 = ((df-df.shift(axis=1)).eq(1))
  2. df2['S1'] = df['S1']
  3. df.append(df2.sum(), ignore_index=True)

输出:

  1. S1 S2 S3
  2. 0 1 1 0
  3. 1 1 0 0
  4. 2 0 1 1
  5. 3 1 1 1
  6. 4 0 0 1
  7. 5 3 1 1

工作原理:

  1. >>> (df-df.shift(axis=1))
  2. S1 S2 S3
  3. 0 NaN 0.0 -1.0
  4. 1 NaN -1.0 0.0
  5. 2 NaN 1.0 0.0
  6. 3 NaN 0.0 0.0
  7. 4 NaN 0.0 1.0
  8. >>> (df-df.shift(axis=1)).eq(1)
  9. S1 S2 S3
  10. 0 False False False
  11. 1 False False False
  12. 2 False True False
  13. 3 False False False
  14. 4 False False True
  15. >>> df2['S1'] = df['S1']
  16. S1 S2 S3
  17. 0 1 False False
  18. 1 1 False False
  19. 2 0 True False
  20. 3 1 False False
  21. 4 0 False True
  22. >>> df2.sum()
  23. S1 3
  24. S2 1
  25. S3 1
  26. dtype: int64
展开查看全部
w8rqjzmb

w8rqjzmb2#

对于本例,我需要计算第1列中“1”的总数,然后,当我考虑第2列时,我需要计算案例[0,1],当我考虑第三列时,我需要计算案例[0,0,1],对于第四列,我需要计算案例[0,0,0,1],依此类推。
事实上,您希望计算第一次出现“1”的位置:

  1. >>> df[~df.eq(0).all(axis=1)].idxmax(axis=1).value_counts()
  2. S1 151
  3. S2 148
  4. S3 113
  5. dtype: int64
  1. >>> df.append(df[~df.eq(0).all(axis=1)].idxmax(axis=1).value_counts(), ignore_index=True)
  2. S1 S2 S3
  3. 0 1 1 1
  4. 1 0 0 0
  5. 2 0 0 0
  6. 3 0 0 0
  7. 4 0 0 0
  8. ... ... ... ...
  9. 14338 0 0 0
  10. 14339 0 0 0
  11. 14340 0 0 0
  12. 14341 0 0 0
  13. 14342 151 148 113
  14. [14343 rows x 3 columns]
展开查看全部

相关问题