比较两个panda数据帧中的值以保持运行计数



我对这篇文章的篇幅感到抱歉,但我想尽可能全面地解释。我对如何解决这个问题完全不知所措。

设置:

我有两个数据帧,第一个数据帧在第一列中列出了所有可能的值,这一列中没有重复的值。让我们称之为df_01。这些是每个列表中所有常见的可能值。所有附加列表示独立的列表。每个值都包含一个数字,表示所有可能值中的任何给定值在该列表上的天数。该数据帧(df_01(具有(9277,32(的形状。这些尺寸可以改变,但通常保持不变。下面是它的一个小例子。

df_01在任何操作之前:

index   values   list01   list02  ... list30   list31
0       aaa      5         1    ...   NaN      83
1       bbb     NaN       NaN   ...   NaN      4
2       ccc      20       NaN   ...   NaN      32
3       ddd      1         27   ...   NaN     NaN
.        .       .         .    ...    .       .
.        .       .         .    ...    .       .
.        .       .         .    ...    .       .  
9274    qqq     NaN        15   ...   NaN      6 
9275    rrr     238       NaN   ...   NaN     102
9276    sss      3         2    ...   NaN     NaN
9277    ttt      12       NaN   ...   NaN      99

第一个数据帧(df_01(将始终是前一天的值。

第二个数据帧。让我们称之为df_2的行总是更少,长度每天都在变化,但列的数量总是与(df_01(相同。它目前的形状是(1351,32(。在这个数据帧(df_2(中,第一列具有截至目前每个列表中的所有公共值,并且没有重复值。如果该值今天在列表中,则该数据帧(df_2(中的其他列具有1,如果没有,则具有NaN。下面是一个例子。

任何操作前的df_02:

index   values   list01   list02  ... list30   list31
0       aaa      1         1    ...   NaN      1
1       bbb     NaN        1    ...    1       1
2       ddd      1         1    ...   NaN     NaN
.        .       .         .    ...    .       .
.        .       .         .    ...    .       .
.        .       .         .    ...    .       .  
1349    qqq     NaN       NaN   ...    1       1 
1350    rrr      1        NaN   ...    1      NaN
1351    sss     NaN        1    ...   NaN      1

问题:

我想完成的事情如下。

1( 对于每列中的每一个值,如果该值存在于第一个数据帧(df_01(中而不存在于第二个数据帧中(df_02(,则其在(df_01(中的计数器将按每列重置为NaN。

2( 然后,对于第二个数据帧(df_02(的每一列中的每一个值,如果该值存在于两个数据帧的同一列中,则对值求和。

3( 如果(df_01(=5的列表01上的aaa和(df_2(=1的列表01中的aaa,则(df_02(的列表01上将变为6。这将保持连续计数。

4( 如果两种情况下的值均为NaN,则无需执行任何操作。

5( 如果值在(df_01(上为NaN,在(df_02(上为1,则保持为1。

***在求和之前,df_02中的值将始终为1或NaN。它是一个二进制选项,用于选择值列中的值是否在当天的单个列表中。

***请注意,值ccc和ttt在(df_01(中,因为它们是可能的值,但在(df_02(中没有,因为它们今天不在任何列表中。

***像*NaN**6*这样的值周围的星号表示将改变的值——它实际上不在数据中。

程序结束后,数据帧应如下所示:

df_01

index   values   list01   list02  ... list30   list31
0       aaa      5         1    ...   NaN      83
1       bbb     NaN       NaN   ...   NaN      4
2       ccc     NaN       NaN   ...   NaN     NaN
3       ddd      1         27   ...   NaN     NaN
.        .       .         .    ...    .       .
.        .       .         .    ...    .       .
.        .       .         .    ...    .       .  
9274    qqq     NaN      *NaN*  ...   NaN      6 
9275    rrr     238       NaN   ...   NaN     *NaN*
9276    sss    *NaN*       2    ...   NaN      24
9277    ttt      12       NaN   ...   NaN      99

df_02

index   values   list01   list02  ... list30   list31
0       aaa     *6*       *2*   ...   NaN     *84*
1       bbb     NaN        1    ...    1      *5*
2       ddd     *2*      *28*   ...   NaN     NaN
.        .       .         .    ...    .       .
.        .       .         .    ...    .       .
.        .       .         .    ...    .       .  
1349    qqq     NaN       NaN   ...    1      *7*
1350    rrr    *239*      NaN   ...    1      NaN
1351    sss     NaN       *3*   ...   NaN    *25*

我该如何完成这样的事情?我甚至不知道从哪里开始。任何想法,即使不完全奏效,也会为我指明正确的方向。如果有什么需要澄清的,请告诉我。

感谢

df1 = df1.set_index('values')
df2 = df2.set_index('values')
cols = [*df1.columns]
for col in cols:
#Update to df1
df1[col].update(df2.loc[df2[col].isnull(), col].fillna('-'))
df1[col].replace('-', np.NaN, inplace = True)
#Update to df2, sum if they both have numbers
df2[col].update(df2.loc[~df2[col].isnull(), col] + df1.loc[~df1[col].isnull(), col])

这应该是你想要的。我们将遍历每一行,然后分别更新它们。确保cols列表包含基于df的正确列。

我们必须在df1的更新中使用.fillna('-')的原因是,你不能用NaN替换一个值,所以我们必须用其他东西填充它,然后我们可以将它替换回NaN。

相关内容

  • 没有找到相关文章

最新更新