根据其他数据框的条件提取数据框的元素

时间:2019-09-11 15:39:15

标签: python pandas dataframe

我相信我的问题确实很简单,而且必须有一种非常简单的方法来解决此问题,但是由于我对Python相当陌生,尤其是熊猫,所以我无法自己解决它。

我组成了以下数据框,它们代表了我正在研究的一种更简单的方案。这么长的解释可能会让人感到恐惧,但我只是想使其尽可能清楚。因此,请考虑:

import pandas as pd

data = pd.DataFrame({'Column 1': [300,300,450,500,500,750,600,300, 150],
'Column 2': [100,130,230,200,300,350,600,550,530], 
'Column 3': [250, 300, 400, 500, 700, 
350, 750, 550, 600]})

df_validate_1 = pd.DataFrame({'Column 1': [1,0,1,1,1,1,1,1, 1],
'Column 2': [1,1,1,1,1,0,0,1,1], 
'Column 3': [0, 1, 1, 1, 1, 
1, 1, 1, 0]})

df_validate_2 = pd.DataFrame({'Column 1': [1,1,1,1,1,0,1,1,1],
'Column 2': [1,1,0,1,1,1,0,0,0], 
'Column 3': [0, 0, 1, 1, 0, 
1, 1, 0, 0]})

df_validate_3 = pd.DataFrame({'Column 1': [1,1,1,0,0,1,1,1,1],
'Column 2': [1,1,1,1,1,1,1,0,0], 
'Column 3': [0, 0, 0, 1, 1, 
1, 1, 1, 1]})

我有一个主数据框和3个不同的数据框用于验证,它们仅为1或0(对或错)。我正在寻找的是找到一种方法,该方法将在数据框“数据”中创建一个数据框,该条件由其他三个验证数据框的条件组成,其中我将仅对“数据”数据框中的元素进行计数对于其他三个数据帧,其相应的列和行对应为1,如果在验证数据帧上的各个位置中的任何一个位置为零,我将其视为NaN。

简要说明我想要的东西: “数据”数据框中第2列的第一个元素为100。对于df_validate_1,df_validate_2和df_validate_3,第二列的第一个元素为1。因此,我会将值传递给新的数据帧。另一方面,列1的第二个元素是300,但是对于那种情况,在df_validate_1的各个位置上的元素是0(即使对于同一位置df_validate_2和df_validate_3是1),因此,我想写成NaN。

我期望得到以下结果:

  Column 1 Column 2 Column 3
0      300      100      NaN
1      NaN      130      NaN
2      450      NaN      NaN
3      NaN      200      500
4      NaN      300      NaN
5      NaN      NaN      350
6      600      NaN      750
7      300      NaN      NaN
8      150      NaN      NaN

自然,我面临着一个更复杂的解决方案,这是一个虚构的示例。从今以后,我正在寻找一种优雅的解决方案,可以将其应用于更可靠的情况。

希望我能做到简洁明了。非常感谢您在此方面的帮助!

3 个答案:

答案 0 :(得分:1)

给出您的数据框:

  • 将它们全部相乘
    • 保留0或将其替换为np.nan
import pandas as pd
import numpy as np

data_updated = data * df_validate_1 * df_validate_2 * df_validate_3

data_updated.replace(0, np.NaN, inplace=True)

输出:

 Column 1  Column 2  Column 3
    300.0     100.0       NaN
      NaN     130.0       NaN
    450.0       NaN       NaN
      NaN     200.0     500.0
      NaN     300.0       NaN
      NaN       NaN     350.0
    600.0       NaN     750.0
    300.0       NaN       NaN
    150.0       NaN       NaN

答案 1 :(得分:1)

我正在使用pd.concat,然后使用groupby获取每个索引的最小值,该最小值代表0或1。这可以用作原始df的掩码。

dfm = pd.concat([df1,df2,df3])
df = df[dfm.groupby(dfm.index).min().astype(bool)]

print(df)
   Column 1  Column 2  Column 3
0     300.0     100.0       NaN
1       NaN     130.0       NaN
2     450.0       NaN       NaN
3       NaN     200.0     500.0
4       NaN     300.0       NaN
5       NaN       NaN     350.0
6     600.0       NaN     750.0
7     300.0       NaN       NaN
8     150.0       NaN       NaN

答案 2 :(得分:0)

您可以使用np.where()

>>> result_df = pd.DataFrame()

>>> result_df['Column 1'] = np.where((df_validate_1['Column 1'] == 1) & (df_validate_2['Column 1'] == 1) & (df_validate_3['Column 1'] == 1), data['Column 1'], [np.nan])

>>> result_df['Column 2'] = np.where((df_validate_1['Column 2'] == 1) & (df_validate_2['Column 2'] == 1) & (df_validate_3['Column 2'] == 1), data['Column 2'], [np.nan])

>>> result_df['Column 3'] = np.where((df_validate_1['Column 3'] == 1) & (df_validate_2['Column 3'] == 1) & (df_validate_3['Column 3'] == 1), data['Column 3'], [np.nan])

>>> result_df

   Column 1  Column 2  Column 3
0     300.0     100.0       NaN
1       NaN     130.0       NaN
2     450.0       NaN       NaN
3       NaN     200.0     500.0
4       NaN     300.0       NaN
5       NaN       NaN     350.0
6     600.0       NaN     750.0
7     300.0       NaN       NaN
8     150.0       NaN       NaN