У меня есть список таких строк:

stringlist = [JAN, jan, FEB, feb, mar]

И у меня есть фрейм данных, который выглядит так:

**date**            **value**
01MAR16                1
05FEB16                12
10jan17                5
10mar15                9
03jan05                7
04APR12                3

Я хочу сохранить только даты, которые содержат одну строку из списка строк, результат должен выглядеть так:

**date**            **value**
NA                     1
05FEB16                12
10jan17                5
10mar15                9
03jan05                7
NA                     3

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

5
ljourney 2 Май 2021 в 23:44

4 ответа

Лучший ответ
stringlist = ["JAN", "jan", "FEB", "feb", "mar"]

m = df["date"].str.contains("|".join(stringlist))
df.loc[~m, "date"] = np.nan
print(df)

Печать:

      date  value
0      NaN      1
1  05FEB16     12
2  10jan17      5
3  10mar15      9
4  03jan05      7
5      NaN      3
4
Andrej Kesely 2 Май 2021 в 20:50

Вы можете использовать Series.str.contains , как показано здесь: Выбрать частичную строку из фрейма данных pandas:

import pandas as pd

df = pd.DataFrame({'date': ['NA', '05FEB16', '10jan17', '10mar15', '03jan05', 'NA'],
                   'value': [1, 12, 5, 9, 7, 3]})

stringlist = ['JAN', 'jan', 'FEB', 'feb', 'mar']

print(df[df['date'].str.contains('|'.join(stringlist))])

Выход:

      date  value
1  05FEB16     12
2  10jan17      5
3  10mar15      9
4  03jan05      7
0
Ann Zen 2 Май 2021 в 20:54

Вы можете просто сделать это:


import pandas as pd

keys = ["JAN", "jan", "FEB", "feb", "mar"]
date = ["01MAR16", "05FEB16", "10jan17", "10mar15", "03jan05", "04APR12"]
value = [1, 12, 5, 9, 7, 3]

df = pd.DataFrame({"date": date,
                   "value": value})

for i in range(len(df)):
    for key in keys:
        if key in df["date"][i]:
            print(df["date"][i], df["value"][i])
            break

Выход

05FEB16 12
10jan17 5
10mar15 9
03jan05 7
0
Marino 2 Май 2021 в 21:03

Еще одна игра с регулярными выражениями - извлечь символы (здесь предполагается, что месяцы всегда будут зажаты между днем ​​и годом), а затем проверить, можно ли найти каждый фрагмент в stringlist:

(df.assign(months = df.date.str.extract(r'([a-zA-Z]+)'), 
           date = lambda df: df.where(df.months.isin(stringlist))
          )
   .iloc[:, :-1]
)

      date  value
0      NaN      1
1  05FEB16     12
2  10jan17      5
3  10mar15      9
4  03jan05      7
5      NaN      3
0
sammywemmy 2 Май 2021 в 23:25