Python 3.x 根据Python中的条件复制和粘贴值
我正试图根据列“B”中的条件,使用列“A”中的值填充列“C”。示例:如果列“B”等于“nan”,则列“C”下的行等于列“A”中的行。如果列“B”不等于“nan”,则保持列“C”不变(即“nan”)。接下来,删除列“A”中的值(仅删除从列A复制到C的值) 原始数据集:Python 3.x 根据Python中的条件复制和粘贴值,python-3.x,pandas,if-statement,conditional-statements,copy-paste,Python 3.x,Pandas,If Statement,Conditional Statements,Copy Paste,我正试图根据列“B”中的条件,使用列“A”中的值填充列“C”。示例:如果列“B”等于“nan”,则列“C”下的行等于列“A”中的行。如果列“B”不等于“nan”,则保持列“C”不变(即“nan”)。接下来,删除列“A”中的值(仅删除从列A复制到C的值) 原始数据集: index A B C 0 6 nan nan 1 6 nan nan 2 9 3 nan 3 9 3 nan 4 2 8
index A B C
0 6 nan nan
1 6 nan nan
2 9 3 nan
3 9 3 nan
4 2 8 nan
5 2 8 nan
6 3 4 nan
7 3 nan nan
8 4 nan nan
输出:
index A B C
0 nan nan 6
1 nan nan 6
2 9 3 nan
3 9 3 nan
4 2 8 nan
5 2 8 nan
6 3 4 nan
7 nan nan 3
8 nan nan 4
下面是我迄今为止尝试过的,但它不起作用
def impute_unit(cols):
Legal_Block = cols[0]
Legal_Lot = cols[1]
Legal_Unit = cols[2]
if pd.isnull(Legal_Lot):
return 3
else:
return Legal_Unit
bk_Final_tax['Legal_Unit'] = bk_Final_tax[['Legal_Block', 'Legal_Lot',
'Legal_Unit']].apply(impute_unit, axis = 1)
看来你需要
df['C'] = np.where(df.B.isna(), df.A, df.C)
df['A'] = np.where(df.B.isna(), np.nan, df.A)
另一种可能很奇特的方法是,仅当B
为np.nan
时,才交换A
和C
值
m = df.B.isna()
df.loc[m, ['A', 'C']] = df.loc[m, ['C', 'A']].values
换句话说,改变
bk_Final_tax['Legal_Unit'] = bk_Final_tax[['Legal_Block', 'Legal_Lot',
'Legal_Unit']].apply(impute_unit, axis = 1)
为了
从
A
中删除值是什么意思?将其设置为nan
?@HarvIpan抱歉造成混淆。我想用“nan”替换当前值。但只有粘贴在“C”列中的值。我已经更新了上面显示的输出。感谢@RafaelC和Harvlpan的快速响应。我犯了一个错误。ValueError:对于参数“inplace”预期的类型bool,收到的类型DataFrameIm未使用参数inplace
anywhere。。但是看起来你是,你正在做inplace=df
,但是你可能想要inplace=True
在前面的代码中,我有inplace=True,但没有你提供的代码。我所做的唯一更改是重命名dataframe和列。我已经尝试了第二个代码,但我得到了以下错误:无法使用多维键进行索引我感谢您的努力。我以前的代码一定有问题,导致它现在出错。我得出去玩一会儿。再次感谢你的帮助。
bk_Final_tax['Legal_Unit'] = np.where(df.Legal_Lot.isna(), df.Legal_Block, df.Legal_Unit)
bk_Final_tax['Legal_Block'] = np.where(df.Legal_Lot.isna(), np.nan, df.Legal_Block)