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

2024-09-24 22:23:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我很抱歉这么长时间,但我想尽可能完整地解释。我完全不知道如何解决这个问题

设置:

我有两个数据帧,第一个数据帧在第一列中列出了所有可能的值,该列中没有重复的值。我们叫它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)的列表01上的aaa=5,且(df_2)的列表01上的aaa=1,则(df_02)的列表01上的aaa将变为6。这将保持连续计数

4)如果两者中的值均为NaN,则无需执行任何操作

5)如果一个值为NaN on(df_01)且为1 on(df_02),则该值保持为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*

我怎样才能完成这样的事情呢?我甚至不知道从哪里开始。任何想法,即使不完全有效,只要能给我指出正确的方向,我都将不胜感激。如果有什么需要澄清的,请告诉我

谢谢


Tags: 数据df列表indexnanvaluesbbbddd
1条回答
网友
1楼 · 发布于 2024-09-24 22:23:07
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

相关问题 更多 >