熊猫在合并两个数据框时创建一个标志

daiyue

我有两个df-df_adf_b

# df_a
number    cur
1000      USD
2000      USD
3000      USD

# df_b
number    amount    deletion
1000      0.0       L
1000      10.0      X
1000      10.0      X
2000      20.0      X
2000      20.0      X
3000      0.0       L
3000      0.0       L

我想左合并df_adf_b

df_a = df_a.merge(df_b.loc[df_b.deletion != 'L'], how='left', on='number')
df_a.fillna(value={'amount':0}, inplace=True)

而且创建一个名为标志deleted的结果df_a,有三种可能的值- fullpartialnone;

full-如果所有与特定number关联的行都具有deletion = L;

partial-如果某些行与特定number关联,则具有deletion = L;

none-没有与特定number关联的行deletion = L

此外,当执行合并,从行df_bdeletion = L不应该被考虑; 所以结果看起来像

 number    amount    deletion    deleted    cur
 1000      10.0      X           partial    USD
 1000      10.0      X           partial    USD
 2000      20.0      X           none       USD
 2000      20.0      X           none       USD
 3000      0.0       NaN         full       USD

我想知道如何实现这一目标。

耶斯列尔

想法是比较deletion列和汇总all,并any创建助手dictionary和最后map对新列:

g = df_b['deletion'].eq('L').groupby(df_b['number'])
m1 = g.any()
m2 = g.all()

d1 = dict.fromkeys(m1.index[m1 & ~m2], 'partial')
d2 = dict.fromkeys(m2.index[m2], 'full')
#join dictionries together
d = {**d1, **d2}
print (d)
{1000: 'partial', 3000: 'full'}

df = df_a.merge(df_b.loc[df_b.deletion != 'L'], how='left', on='number')
df['deleted'] = df['number'].map(d).fillna('none')
print (df)
   number  cur  amount deletion  deleted
0    1000  USD    10.0        X  partial
1    1000  USD    10.0        X  partial
2    2000  USD    20.0        X     none
3    2000  USD    20.0        X     none
4    3000  USD     NaN      NaN     full

对于指定列none,如果要为其创建字典:

d1 = dict.fromkeys(m1.index[m1 & ~m2], 'partial')
d2 = dict.fromkeys(m2.index[m2], 'full')
d3 = dict.fromkeys(m2.index[~m1], 'none')
d = {**d1, **d2, **d3}
print (d)
{1000: 'partial', 3000: 'full', 2000: 'none'}

df = df_a.merge(df_b.loc[df_b.deletion != 'L'], how='left', on='number')
df['deleted'] = df['number'].map(d)
print (df)
   number  cur  amount deletion  deleted
0    1000  USD    10.0        X  partial
1    1000  USD    10.0        X  partial
2    2000  USD    20.0        X     none
3    2000  USD    20.0        X     none
4    3000  USD     NaN      NaN     full

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当一个在熊猫中具有multiIndex时合并两个数据框

熊猫:如何通过保留第一个数据框的信息来合并两个数据框?

熊猫通过比较两个数据框创建一个新列

R:合并两个数据框时选择一个单元格

从两个数据框创建一个列表

当一个数据框为空时,迭代两个熊猫数据框错误

根据其他两个数据框的单元格内容创建一个熊猫数据框

大熊猫合并两个数据框,其中一个包含另一列的值

如何使用两个熊猫数据框创建一个新数据框,其中一个数据框具有特定的行?

熊猫:合并(或内部联接)两个数据框,但仅保留其中一个列

熊猫:将两个数据框列合并到一个已排序的列中

与熊猫合并两个数据框

合并两个数据框熊猫

熊猫基于一个表中的一列合并两个数据帧,该数据框位于另一表中的两列之间

将R中的两个列表合并到一个数据框中

熊猫将两个数据序列合并为一个序列

比较两个数据框的列并创建一个新的数据框

如何合并两个数据框,然后将结果与另一个数据框相乘?

Python:如何通过保留第一个数据框的信息来合并两个数据框?

根据索引合并两个数据帧(从数据透视表创建一个df)

合并两个数据框并根据公共列选择第一个条目

将两个字典合并为一个数据框

如何基于一个表的范围值合并两个数据框

合并具有一个公共列名的两个数据框

在特定列上将两个数据框合并为一个

Python:列命名并将两个数据框合并为一个

R:从两个列表创建一个数据框

合并两个数据源以创建一个对象数组

熊猫:加入/合并/合并两个数据框