【问题标题】:Pandas not counting rows properly熊猫没有正确计算行数
【发布时间】:2019-01-17 00:13:00
【问题描述】:

所以我有这个数据框:

         filename  width  height    class  xmin  ymin  xmax  ymax
0      128782.JPG    640     512    Panel    36   385   119   510
1      128782.JPG    640     512    Panel   124   388   207   510
2      128782.JPG    640     512    Panel   210   390   294   511
3      128782.JPG    640     512    Panel   294   395   380   510
4      128782.JPG    640     512    Panel   379   398   466   511
5      128782.JPG    640     512    Panel   465   402   553   510
6      128782.JPG    640     512     P+SD   552   402   638   510
7      128782.JPG    640     512     P+SD   558   264   638   404
...
...
57170     128782.JPG    640     512     P+SD    36   242   121   383
57171     128782.JPG    640     512  HS+P+SD    36    97   122   242
57172     128782.JPG    640     512     P+SD   214   106   304   250

在名为“class”的列中包含唯一值“Panel”、“P+SD”和“HS+P+SD”。我想计算这些值有多少行,所以我尝试了这个:

print(len(split_df[split_df["class"].str.contains('Panel')]))
print(len(split_df[split_df["class"].str.contains('HS+P+SD')]))
print(len(split_df[split_df["class"].str.contains('P+SD')]))

这给了我这个输出:

56988
0
0

这是不正确的,您可以根据上面提供的 DataFrame 的 sn-p 清楚地看到,为什么 Panel 的所有内容都正确计算,而其他两个“类”名称没有计算在内?

这是 split_df.info 的输出:

RangeIndex: 57172 entries, 0 to 57171
Data columns (total 8 columns):
filename    57172 non-null object
width       57172 non-null int64
height      57172 non-null int64
class       57172 non-null object
xmin        57172 non-null int64
ymin        57172 non-null int64
xmax        57172 non-null int64
ymax        57172 non-null int64
dtypes: int64(6), object(2)
memory usage: 3.5+ MB

我终其一生都无法弄清楚哪里出了问题。任何帮助表示赞赏。

【问题讨论】:

  • 我将 + 换成了反斜杠 (/)。这似乎解决了我的计数问题,为什么 + 会干扰这个?

标签: python string pandas


【解决方案1】:

pd.Series.str.contains 默认有regex=True。由于+ 是正则表达式中的特殊字符,请使用regex=Falsere.escape\ 转义:

import re
s = pd.Series(['HS+P+SD', 'AB+CD+EF'])

s.str.contains('HS+P+SD').sum()               # 0
s.str.contains('HS+P+SD', regex=False).sum()  # 1
s.str.contains(re.escape('HS+P+SD')).sum()    # 1
s.str.contains('HS\+P\+SD').sum()             # 1

我想计算这些值有多少行

如果这是您的核心问题,并且您不希望 'P+SD' 计数包含 'HS+P+SD',请不要使用 str.contains。检查是否相等,并在您希望计算的值上使用value_counts

L = ['Panel', 'HS+P+SD', 'P+SD']
counts = df.loc[df['class'].isin(L), 'class'].value_counts()

或者对于所有个计数,只需使用df['class'].value_counts()

【讨论】:

  • 或者s.value_counts() 应该为你处理它。
  • @piRSquared,我想过这个,但是 OP 的数据有 P+SDHS+P+SD,所以他们可能想搜索前者以包含后者。
【解决方案2】:

试试:

print(len(split_df[split_df["class"].str == 'HS+P+SD']))

【讨论】:

  • 这也很有效,正则表达式基本上将 + 视为特殊符号。感谢您的帮助:)
【解决方案3】:

也可以使用 in 进行简单的 for 循环

sum(['HS+P+SD' in x for x in df['class']])

关于时间安排(如果你想查看这个link

df=pd.concat([df]*100)
%timeit df['class'].str.contains('HS+P+SD', regex=False).sum()
1000 loops, best of 3: 410 µs per loop
%timeit sum(['HS+P+SD' in x for x in df['class']])
10000 loops, best of 3: 123 µs per loop

【讨论】:

    猜你喜欢
    • 2019-05-07
    • 1970-01-01
    • 2016-07-01
    • 2018-08-30
    • 2022-11-01
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多