Python 3.x 根据Python中的条件复制和粘贴值

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

我正试图根据列“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    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)