Groupby 熊猫中字符串的一部分

lad*_*bug 5 python group-by pandas

我正在尝试通过将字符串的一部分分组到列中来构建新的数据框。

import pandas

df = pandas.DataFrame([{'A': 'string_300_bla1', 'B': "Hi", 'C': 3},
                       {'A': 'string_300_blaa2', 'B': "Hello", 'C': 4},
                       {'A': 'string_487_blaaa1', 'B': "nice", 'C': 9},
                       {'A': 'string_487_blaaa2', 'B': "day", 'C': 6}])
Run Code Online (Sandbox Code Playgroud)

我想从字符串的这一部分创建一个 groupby

字符串_ 300 _bla1

我试过:

import re

dfs = df['A'].str.contains('.*_\d+_.*', re.IGNORECASE).groupby(df['B'])
Run Code Online (Sandbox Code Playgroud)

我的输出:

<pandas.core.groupby.generic.SeriesGroupBy object at 0x00000279EFD009E8>
Run Code Online (Sandbox Code Playgroud)

良好的输出:

dfs = pandas.DataFrame([{'A': 'string_300', 'B': "Hi\n\nHello"},
                       {'A': 'string_487', 'B': "nice\n\nday"}])
Run Code Online (Sandbox Code Playgroud)

Qua*_*ang 5

我们可以做的:

(df.groupby(df.A.str.extract('(\w+_\d+)')[0])
   .agg({'B':'\n\n'.join, 'C':'sum'})
   .reset_index()
)
Run Code Online (Sandbox Code Playgroud)

输出:

            0            B   C
0  string_300  Hi\n\nHello   7
1  string_487  nice\n\nday  15
Run Code Online (Sandbox Code Playgroud)

正如@CharlesGleason 所指出的,这是提取数字部分的解决方案:

(df.groupby(df.A.str.extract('\w+_(\d+)')[0])
   .agg({'A':'first', 'B':'\n\n'.join, 'C':'sum'})
   .reset_index(drop=True)
)
Run Code Online (Sandbox Code Playgroud)