我对 pandas 数据框进行了一系列操作。
由于某些过滤条件,某些数据帧可能为空。
当我在输入数据帧中有数据时,下面的应用函数正在工作,因为它不会在输入数据帧中没有数据的新列上返回应用逻辑输出。
以下是示例代码。
import pandas as pd
import numpy as np
#df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'p': [11, 12, 13]})
#df2 = pd.DataFrame({'A': [1, 2, 3], 'B': [7, 8, 9], 'q': [21, 22, 23]})
df1 = pd.DataFrame({'A': [], 'B': [], 'p': []})
df2 = pd.DataFrame({'A': [], 'B': [], 'q': []})
merged_df = pd.merge(df1, df2, on='A', suffixes=('', '_d'))\
.assign(D=lambda x: np.where(((x['B'] == 4) & (x['B_d'] == 7) & (x['p'] < x['q'])), 'Y',
(((x['B'] == 5) & (x['B_d'] == 8) & (x['p'] > x['q'])),'N','NA')
))
print(merged_df)
上面的代码返回给我一个错误,
ValueError: operands could not be broadcast together with shapes (0,) () (3,)
我使用Apply尝试了以下操作
merged_df1 = pd.merge(df1, df2, on='A', suffixes=('', '_d'))\
.apply(lambda x: 'Y' if (x['B'] == 4) & (x['B_d'] == 7) & (x['p'] < x['q']) else
'N' if (x['B'] == 5) & (x['B_d'] == 8) & (x['p'] > x['q']) else None
)
print(merged_df1)
merged_df1 没有返回任何错误,也没有输出应用函数逻辑
您的代码工作正常,但您也必须在内部条件中使用
numpy.where
:
merged_df = pd.merge(df1, df2, on='A', suffixes=('', '_d'))\
.assign(D=lambda x: np.where(((x['B'] == 4) & (x['B_d'] == 7) & (x['p'] < x['q'])), 'Y',
np.where(((x['B'] == 5) & (x['B_d'] == 8) & (x['p'] > x['q'])),'N','NA')
))
为了完整起见,您还可以使用纯 pandas:
merged_df = (pd
.merge(df1, df2, on='A', suffixes=('', '_d'))
.assign(D=lambda x: ((x['B'] == 5) & (x['B_d'] == 8) & (x['p'] > x['q'])).map({True: 'N', False: 'NA'})
.mask(((x['B'] == 4) & (x['B_d'] == 7) & (x['p'] < x['q'])), 'Y')
)
)
输出1:
A B p B_d q D
0 1 4 11 7 21 Y
1 2 5 12 8 22 NA
2 3 6 13 9 23 NA
输出2:
Empty DataFrame
Columns: [B, p, A, B_d, q, D]
Index: []