我相信我的问题确实很简单,而且必须有一种非常简单的方法来解决此问题,但是由于我对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
自然,我面临着一个更复杂的解决方案,这是一个虚构的示例。从今以后,我正在寻找一种优雅的解决方案,可以将其应用于更可靠的情况。
希望我能做到简洁明了。非常感谢您在此方面的帮助!
答案 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