ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

从大 df 中删除小 df 具有的记录

2020-12-05 18:30:15  阅读:271  来源: 互联网

标签:hash 令狐冲 删除 df big 从大 merge small


问题:
有一大一小两个df:df_big 和 df_small,格式如下。其中 df_small 中的记录在 df_big 中也有。现在想把 df_big 中存在的 df_small 记录删掉。

index          tdate        stk  weight   id    type ind
57304  20181116  603328.SH  0.0069  令狐冲  关注池组合2  电子
57305  20181116  300476.SZ  0.0182  令狐冲  关注池组合2  电子
57306  20181116  603936.SH  0.0029  令狐冲  关注池组合2  电子
57307  20181116  002815.SZ  0.0110  令狐冲  关注池组合2  电子
57308  20181116  603228.SH  0.0144  令狐冲  关注池组合2  电子
57309  20181116  002841.SZ  0.0140  令狐冲  关注池组合2  电子

2、解决方案
1)利用 merge 函数中的 indicator 参数

result = pd.merge(df_big, df_small, how='left', indicator=True).query("_merge=='left_only'").drop('_merge', 1)

merge的语法见[pandas API](http://pandas.pydata.org/pandas-docs/stable/merging.html)

In [47]: result = pd.merge(left, right, how='inner', on=['key1', 'key2'])

2)将内容转成 hash 值后进行比较
a、将两个 df 的行记录,每行内容先合并成一行str,然后将其转成对应的 hash 值,从而得到大小两个 hash 值 Series;
b、对两个 hash 值的 Series进行集合计算,求大 hash 值Series 除去小 hash值Series的结果,得到只存在于大Series中的hash值;
c、确定结果中hash值在大Series中的位置,这个位置就是 df_big 中有,而小df没有的行记录的行索引

# 将series中的一行内容转成一个长串str,之后这行str的hash值并返回
def make_hash(ser):
    s1 = (str(ser.T.tolist())[1:-1]).split(',')
    s2 = hash(''.join(s1))
    return s2

# 将数据转成hash数据
df_big_hash = df_big.apply(make_hash, axis=1)
df_small_hash = df_small.apply(make_hash, axis=1)

# 找出大df中才有的hash行
diff = list(set(df_big_hash).difference(set(df_small_hash)))

# 找到大df中才有的行数据
loca_list = df_big_hash[df_big_hash[0].isin(diff)].index.tolist()
new_record = df_big_hash.loc[loca_list, :]

其中第1个方法比第2个快很多。

标签:hash,令狐冲,删除,df,big,从大,merge,small
来源: https://blog.csdn.net/domodo2012/article/details/110705597

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有