我有以下数据库:
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
我希望o再创建两个名为Quant
和B/S
的列
对于Quant
,它的工作状况如下:
df ['Quant'] = df ['Buy']。fillna(df ['Sell'])#从两个列中获取可用值,并且如果两个值均为Nan
,则输出为{{1} }。
输出为:
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
答案 0 :(得分:2)
您可以执行相等性测试并将其输入numpy.where
:
df['B/S'] = np.where(df['Quant'] == df['Buy'], 'B', 'S')
对于两个值均为null的情况,您可以使用其他步骤:
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