Pandas DataFrame解析整数

时间:2018-10-26 21:00:12

标签: python pandas

这就是我的df的样子

person_a
done 37918 , 37925 to37932 ,37934 to 37939 (17 )

person_b
Done 37940 to 37950 (12 ) and 38101 to 38109 ( 9 )

(找不到并排显示它们的好方法,person_a和person_b是列)。我需要解析()之外的所有整数,然后将所有值(包括to之间的值)都包含到新的数据帧(video_df)中。 ()中的数字小于<1000,外部的数字大于10000

我知道我可以提取()之外的数字

video_numbers = df['person_a'].str.extractall(r'(\d+)')[0]
video_df[person_a] = video_numbers[video_numbers.str.len() > 4]

但不确定如何使用to

进行扩展

我的结果应该是video_df

person_a    person_b
37918       37940
37925       37941
37926       .
.           37950
.           38101
37932       .
37934       .
.           38109
.           0
37939       0

用0填充空行。让我知道是否有任何不清楚的地方。

1 个答案:

答案 0 :(得分:1)

可能不会那么短,但是我认为使用一些正则表达式和列表操作是可能的。 首先,我从字符串中为每个人提取了数字

df1.replace(to_replace=['\(\d+ \)','\( \d+ \)','Done','done'],value='', regex=True, inplace=True)
df1.replace(to_replace=['to'],value='-', regex=True, inplace=True)
df1.replace(to_replace=['and'],value=',', regex=True, inplace=True)
df1.person_a = df1.person_a.str.split(',')
df1.person_b = df1.person_b.str.split(',')

df1

                                    person_a                             person_b
0  [ 37918 ,  37925 -37932 , 37934 - 37939 ]  [ 37940 - 37950  ,  38101 - 38109 ]

第二步是为每个具有范围的人创建df

person_a = pd.DataFrame(df1['person_a'].values.tolist()).T.rename(columns={0:'person_a'})
person_a = person_a.person_a.str.split('-', expand=True) \
                                .rename(columns={0:'start', 1:'end'}) \
                                .convert_objects(convert_numeric=True) \
                                .fillna(0)

person_b = pd.DataFrame(df1['person_b'].values.tolist()).T.rename(columns={0:'person_b'})
person_b = person_b.person_b.str.split('-', expand=True) \
                                .rename(columns={0:'start', 1:'end'}) \
                                .convert_objects(convert_numeric=True) \
                                .fillna(0)

person_a

   start      end
0  37918      0.0
1  37925  37932.0
2  37934  37939.0

person_b

   start    end
0  37940  37950
1  38101  38109

最后一步是定义一个为每个人创建号码列表的功能

def ranges(df):
    x = []
    for i in range(df.shape[0]):
        if df.end[i] == 0:
            x.append(list(range(int(df.start[i]), int(df.start[i])+1)))
        else:
            x.append(list(range(int(df.start[i]), int(df.end[i])+1)))

    x = [val for sublist in x for val in sublist]
    return x


df = pd.DataFrame({'person_a':pd.Series(ranges(person_a)),'person_b':pd.Series(ranges(person_b))}).fillna(0)

df

    person_a  person_b
0    37918.0     37940
1    37925.0     37941
2    37926.0     37942
3    37927.0     37943
4    37928.0     37944
5    37929.0     37945
6    37930.0     37946
7    37931.0     37947
8    37932.0     37948
9    37934.0     37949
10   37935.0     37950
11   37936.0     38101
12   37937.0     38102
13   37938.0     38103
14   37939.0     38104
15       0.0     38105
16       0.0     38106
17       0.0     38107
18       0.0     38108
19       0.0     38109