我有以下数据库:
df = pandas.DataFrame({'Buy':[10,np.nan,2,np.nan,np.nan,4],'Sell':[np.nan,7,np.nan,9,np.nan,np.nan]})
Out[37]:
Buy Sell
0 10.0 NaN
1 NaN 7.0
2 2.0 NaN
3 NaN 9.0
4 NaN NaN
5 4.0 NaN
我想再创建两个名为
Quant
和B/S
的列对于
Quant
,它可以按以下方式正常工作:df ['Quant'] = df ['Buy']。fillna(df ['Sell'])#从两个列中获取可用值,如果两个值均为
Nan
,则输出为Nan
。输出为:
df
Out[39]:
Buy Sell Quant
0 10.0 NaN 10.0
1 NaN 7.0 7.0
2 2.0 NaN 2.0
3 NaN 9.0 9.0
4 NaN NaN NaN
5 4.0 NaN 4.0
但是我想基于“他们在创建
B/S
时从哪个列中获取了价值”来创建Quant
最佳答案
您可以执行相等性测试并将其输入numpy.where
:
df['B/S'] = np.where(df['Quant'] == df['Buy'], 'B', 'S')
对于两个值都为空的情况,可以使用附加步骤:
df.loc[df[['Buy', 'Sell']].isnull().all(1), 'B/S'] = np.nan
例
from io import StringIO
import pandas as pd
mystr = StringIO("""Buy Sell
10 nan
nan 8
4 nan
nan 5
nan 7
3 nan
2 nan
nan nan""")
df = pd.read_csv(mystr, delim_whitespace=True)
df['Quant'] = df['Buy'].fillna(df['Sell'])
df['B/S'] = np.where(df['Quant'] == df['Buy'], 'B', 'S')
df.loc[df[['Buy', 'Sell']].isnull().all(1), 'B/S'] = np.nan
结果
print(df)
Buy Sell Quant B/S
0 10.0 NaN 10.0 B
1 NaN 8.0 8.0 S
2 4.0 NaN 4.0 B
3 NaN 5.0 5.0 S
4 NaN 7.0 7.0 S
5 3.0 NaN 3.0 B
6 2.0 NaN 2.0 B
7 NaN NaN NaN NaN
关于python - Pandas 结合两列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51210985/