在熊猫中快速引用数据字段?

时间:2020-09-22 14:51:03

标签: python regex pandas

我正在熊猫工作,试图创建一些字典来存储与特定唯一行值有关的数据字段。

示例数据:

Date, Indicator, Income
01 Jan 2000, 1.01.02 Sales, $400
02 Jan 2000, 1.01.02 Sales, $600
07 July 2000, 3.01.03 Exports, $500

示例代码:

Indicators = df['Indicator'].unique().tolist()
# to create a datafield for each unique indicator under the Indicators heading
I_dict = {I: df.loc[df['Indicator'] == I] for I in Indicators}

我的问题是指标本身真的很长-它们在开始时就有一个代码可以识别它们,但是我无法弄清楚如何将它们分开并仍然遵循此过程。

要解决此问题,我使用了以下内容:(其中'3.05.10 Overseas Exports'是指示器)

print(I_dict['3.05.10 Overseas Exports'])

我希望将其标记为“ 3.05.10”。 这可能吗?另一个问题是,并非所有代码都具有该长度,有些是'5.02'。

1 个答案:

答案 0 :(得分:0)

假设您有一个如下所示的数据框

df
           Date        Indicator Income
0   01 Jan 2000    1.01.02 Sales   $400
1   02 Jan 2000    1.01.02 Sales   $600
2  07 July 2000  3.01.03 Exports   $500
3   01 Jan 2000     1.01 Sales A   $400
4   02 Jan 2000     1.01 Sales A   $600
5  07 July 2000   3.01 Exports A   $500

你能做的是

import re

# this regex captures all the digits and dots. the last dot-digit combination
# is optional
r = re.compile(r"(\d+\.\d+(?:\.\d+)?)")

# create a short indicator
df['ShortInd'] = df.Indicator.map(lambda x: r.search(x).group(0))
df
           Date        Indicator Income ShortInd
0   01 Jan 2000    1.01.02 Sales   $400  1.01.02
1   02 Jan 2000    1.01.02 Sales   $600  1.01.02
2  07 July 2000  3.01.03 Exports   $500  3.01.03
3   01 Jan 2000     1.01 Sales A   $400     1.01
4   02 Jan 2000     1.01 Sales A   $600     1.01
5  07 July 2000   3.01 Exports A   $500     3.01

# create your dictionary
i_dict = {g: sub_df for g, sub_df in df.groupby('ShortInd')}

i_dict.keys()
dict_keys(['1.01', '1.01.02', '3.01', '3.01.03'])

i_dict['1.01']
          Date     Indicator Income ShortInd
3  01 Jan 2000  1.01 Sales A   $400     1.01
4  02 Jan 2000  1.01 Sales A   $600     1.01