仅保留包含字符串列表中的字符串的 df 列值

Only keep df column values that contain a string from list of string

我有一个这样的字符串列表:

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

我刚开始使用正则表达式,所以在思考时遇到了一些麻烦,希望能得到一些帮助。

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

您可以使用 Series.str.contains method as demonstrated here: Select by partial string from a pandas DataFrame:

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

您可以简单地这样做:


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

正则表达式的另一个玩法是提取字符(这里假设月份总是夹在日和年之间),然后检查是否可以在 stringlist:[=12 中找到每个提取的字符=]

(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