我有两个数据帧如下

df1 = pd.DataFrame( {
    "names": ['alpha', 'bravo', 'charlie', 'delta', 'echo', 'foxtrot', 'golf'],
    "Debit": [0, 5000, 0, 5000, 3000, 0, 700],
    "Credit": [1000, 0, 2000, 0, 0, 8000, 0],
} )

df2 = pd.DataFrame( {
    "names": ['alpha', 'bravo', 'charlie', 'delta', 'echo', 'foxtrot'],
    "db_head": [1, 1, 1, 1, 1, 1],
    "cr_head": [2, 2, 2, 2, 2, 2],
} )

我想要的输出是:

     names  Debit  Credit   head
0    alpha      0    1000      2
1    bravo   5000       0      1
2  charlie      0    2000      2
3    delta   5000       0      1
4     echo   3000       0      1
5  foxtrot      0    8000      2

I tried to merge but did not underst和 how to get the value from two of the last columns based on the current df's column values

如果无条件合并

print(df1.merge(df2, how="inner", on="names"))

通过简单地合并这两个数据帧,结果如下

     names  Debit  Credit  db_head  cr_head
0    alpha      0    1000        1        2
1    bravo   5000       0        1        2
2  charlie      0    2000        1        2
3    delta   5000       0        1        2
4     echo   3000       0        1        2
5  foxtrot      0    8000        1        2

我try 了这两种方法,但这两种方法都有错误

df1['acchead'] = [df2[df2['names'] == x].db_head.item() if y > 0 else df2[df2['names'] == x].cr_head.item() for x, y in [df1['names'], df1['Debit']]]

df1['acchead'] = [df2[df2['names'] == x].db_head.item() if df1.Debit.item() > 0 else df2[df2['names'] == x].cr_head.item() for x in [df1['names']]]

任何帮助都将不胜感激.

推荐答案

您可以使用merge,然后使用popwhere对输出进行后处理:

out = df1.merge(df2, on='names', how='inner')

out['head'] = out.pop('db_head').where(out['Debit'].ne(0), out.pop('cr_head'))

输出:

     names  Debit  Credit  head
0    alpha      0    1000     2
1    bravo   5000       0     1
2  charlie      0    2000     2
3    delta   5000       0     1
4     echo   3000       0     1
5  foxtrot      0    8000     2

在合并前进行reshape 的其他方法:

(df1.assign(variable=np.where(df1['Debit'].ne(0), 'db_head', 'cr_head'))
    .merge(df2.melt('names', value_name='head'), on=['names', 'variable'])
    #.drop(columns='variable')
)

输出:

     names  Debit  Credit variable  head
0    alpha      0    1000  cr_head     2
1    bravo   5000       0  db_head     1
2  charlie      0    2000  cr_head     2
3    delta   5000       0  db_head     1
4     echo   3000       0  db_head     1
5  foxtrot      0    8000  cr_head     2

Python相关问答推荐

Snap 7- read_Area用于类似地址的变量

GEKKO:已知延迟的延迟系统的参数估计

sys.modulesgo 哪儿了?

如何修复使用turtle和tkinter制作的绘画应用程序的撤销功能

Pandas :多索引组

如何根据日期和时间将状态更新为已过期或活动?

我必须将Sigmoid函数与r2值的两种类型的数据集(每种6个数据集)进行匹配,然后绘制匹配函数的求导.我会犯错

try 与gemini-pro进行多轮聊天时出错

点到面的Y距离

将jit与numpy linSpace函数一起使用时出错

发生异常:TclMessage命令名称无效.!listbox"

当递归函数的返回值未绑定到变量时,非局部变量不更新:

Pandas Loc Select 到NaN和值列表

如何从列表框中 Select 而不出错?

如果初始groupby找不到满足掩码条件的第一行,我如何更改groupby列,以找到它?

在Admin中显示从ManyToMany通过模型的筛选结果

具有相同图例 colored颜色 和标签的堆叠子图

pysnmp—lextudio使用next()和getCmd()生成器导致TypeError:tuple对象不是迭代器''

Cython无法识别Numpy类型

在Python中控制列表中的数据步长