我对这篇文章的篇幅感到抱歉,但我想尽可能全面地解释。我对如何解决这个问题完全不知所措。
设置:
我有两个数据帧,第一个数据帧在第一列中列出了所有可能的值,这一列中没有重复的值。让我们称之为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。