我有以下数据库:

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


我想再创建两个名为QuantB/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/

10-12 16:50