【问题标题】:Slice pandas dataframe by part of string value in column按列中的部分字符串值对熊猫数据框进行切片
【发布时间】:2021-02-21 17:05:48
【问题描述】:

我有一个 pandas 数据框,其中包含一个包含 9 个字符串的列。我想在数据框中找到与此字符串中 9 个字符中的前 3 个匹配的行。

我当前的解决方案在数据框中创建了一个新列,它只是对字符串的前 3 个字符进行切片,但我想在不创建新列的情况下解决这个问题(因为我以后必须删除它)。如果可以提供帮助,我通常不喜欢更改数据框。

例子:

import pandas as pd

# sample dataframe:
cid=[1,2,3,4,5,6,7,8,9,10]
strings=[
    'tncduuqcr',
    'xqjfykalt',
    'arzouazgz',
    'tncknojbi',
    'xqjgfcekh',
    'arzupnzrx',
    'tncfjxyox',
    'xqjeboxdn',
    'arzphbdcs',
    'tnctnfoyi',
]

df=pd.DataFrame(list(zip(cid,strings)),columns=['cid','strings'])

# This is the step I would like to avoid doing:
df['short_strings']=df['strings'].str[0:3]

out_dict={}

for x in df['short_strings'].unique():
    df2=df[df['short_strings']==x]
    out_dict[x]=df2

# the separate dataframes:
for x in out_dict.keys():
    print(out_dict[x])

输出:

   cid    strings short_strings
0    1  tncduuqcr           tnc
3    4  tncknojbi           tnc
6    7  tncfjxyox           tnc
9   10  tnctnfoyi           tnc
   cid    strings short_strings
1    2  xqjfykalt           xqj
4    5  xqjgfcekh           xqj
7    8  xqjeboxdn           xqj
   cid    strings short_strings
2    3  arzouazgz           arz
5    6  arzupnzrx           arz
8    9  arzphbdcs           arz

我尝试过简单地比较==df['strings'].str[0:3],但这似乎不起作用。

【问题讨论】:

  • 您能否将预期的输出添加到您的问题中?
  • 我已经添加了打印的数据框。

标签: python pandas string dataframe slice


【解决方案1】:

对于这种类型的操作,我们使用DataFrame.groupby() + GroupBy.__iter__(),此处使用Series.unique 进行索引比较慢:

mydict = dict(df.groupby(df.strings.str[:3]).__iter__())
print(mydict)

输出

{'arz':    cid    strings
 2    3  arzouazgz
 5    6  arzupnzrx
 8    9  arzphbdcs,
 'tnc':    cid    strings
 0    1  tncduuqcr
 3    4  tncknojbi
 6    7  tncfjxyox
 9   10  tnctnfoyi,
 'xqj':    cid    strings
 1    2  xqjfykalt
 4    5  xqjgfcekh
 7    8  xqjeboxdn}

【讨论】:

  • 我应该更清楚一点 - 在我的应用程序中,我只对组的一个子集感兴趣,其中一些将被组合在一起。因此,我可以将 .unique 替换为我感兴趣的字符串列表。此外,一些字符串将组合在一起(例如:'arz' 和 'tnc' 保存在同一个数据框/字典条目中)。有没有办法用 groupby 做到这一点? (或者更好地问:有没有办法在 groupby 中包含一个“if”语句?)
猜你喜欢
  • 2021-02-27
  • 2015-05-11
  • 2018-03-29
  • 2016-05-17
  • 1970-01-01
  • 2020-02-22
  • 2018-10-04
  • 2015-06-25
  • 2015-10-30
相关资源
最近更新 更多