仅保留包含字符串列表中的字符串的 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
我有一个这样的字符串列表:
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