Разбор Pandas DataFrame для целых чисел - PullRequest
0 голосов
/ 27 октября 2018

Вот так выглядит мой 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 голосов
/ 28 октября 2018

может быть, не так коротко, но я думаю, что с некоторыми регулярными выражениями и манипуляциями со списком это возможно.сначала я извлекаю числа из строки для каждого человека

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...