这就是我的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填充空行。让我知道是否有任何不清楚的地方。
答案 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