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

时间:2018-07-24 19:00:20

标签: 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    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)

1 个答案:

答案 0 :(得分:2)

看起来像您需要的

df['C'] = np.where(df.B.isna(), df.A, df.C)
df['A'] = np.where(df.B.isna(), np.nan, df.A)

另一种可能可行的方法是仅在AC时交换Bnp.nan

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)

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)