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

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

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

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

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

import pandas as pd
data = [[1, 1, 0], [1, 0, 0], [0, 1, 1], [1, 1, 1], [0, 0, 1], [3, 1, 1]]
df_out = pd.DataFrame(data, columns=["S1", "S2", "S3"])
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的解决方案进行一些预处理:

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

或者,或者

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

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

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

输出:

S1  S2  S3
0   1   1   0
1   1   0   0
2   0   1   1
3   1   1   1
4   0   0   1
5   3   1   1

工作原理:

>>> (df-df.shift(axis=1))
   S1   S2   S3
0 NaN  0.0 -1.0
1 NaN -1.0  0.0
2 NaN  1.0  0.0
3 NaN  0.0  0.0
4 NaN  0.0  1.0

>>> (df-df.shift(axis=1)).eq(1)
       S1     S2     S3
0  False  False  False
1  False  False  False
2  False   True  False
3  False  False  False
4  False  False   True

>>> df2['S1'] = df['S1']
   S1     S2     S3
0   1  False  False
1   1  False  False
2   0   True  False
3   1  False  False
4   0  False   True

>>> df2.sum()
S1    3
S2    1
S3    1
dtype: int64
w8rqjzmb

w8rqjzmb2#

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

>>> df[~df.eq(0).all(axis=1)].idxmax(axis=1).value_counts()
S1    151
S2    148
S3    113
dtype: int64
>>> df.append(df[~df.eq(0).all(axis=1)].idxmax(axis=1).value_counts(), ignore_index=True)
        S1   S2   S3
0        1    1    1
1        0    0    0
2        0    0    0
3        0    0    0
4        0    0    0
...    ...  ...  ...
14338    0    0    0
14339    0    0    0
14340    0    0    0
14341    0    0    0
14342  151  148  113

[14343 rows x 3 columns]

相关问题