根据条件替换 pandas 数据框列中的 int 或字符串的一部分
replace part of an int or string in a pandas dataframe column upon condition
我有一个 pandas 数据框,其中有一列表示日期但以 int 格式保存。对于几个日期,我有第 13 个月和第 14 个月。我想用第 12 个月替换第 13 个月和第 14 个月。然后,最终将其转换为date_time格式。
Original_date
20190101
20191301
20191401
New_date
20190101
20191201
20191201
我尝试将格式替换为字符串,然后仅根据字符串 [4:6] 中的月份索引进行替换,但没有成功:
df.original_date.astype(str)
for string in df['original_date']:
if string[4:6]=="13" or string[4:6]=="14":
string.replace(string, string[:4]+ "12" + string[6:])
print(df['original_date'])
为什么不直接写一个正则表达式?
s = pd.Series('''20190101
20191301
20191401'''.split('\n')).astype(str)
s.str.replace('(?<=\d{4})(13|14)(?=01)', '12', regex=True)
产量:
0 20190101
1 20191201
2 20191201
dtype: object
(注意,您需要将输出重新分配回列以将其保存在内存中。)
您可以将 .str.replace
与正则表达式一起使用
df['New_date'] = df['Original_date'].astype(str).str.replace('(\d{4})(13|14)(\d{2})', r'\g<1>12', regex=True)
print(df)
Original_date New_date
0 20190101 20190101
1 20191301 20191201
2 20191401 20191201
您可以将替换和逻辑编写在一个单独的函数中,如果您还需要更改年或月,这也使您可以轻松调整它。 apply
允许您在 DataFrame 的每一行上使用该函数。
import pandas as pd
def split_and_replace(x):
year = x[0:4]
month = x[4:6]
day = x[6:8]
if month in ('13', '14'):
month = '12'
else:
pass
return year + month + day
df = pd.DataFrame(
data={
'Original_date': ['20190101', '20191301', '20191401']
}
)
res = df.Original_date.apply(lambda x: split_and_replace(x))
print(res)
我有一个 pandas 数据框,其中有一列表示日期但以 int 格式保存。对于几个日期,我有第 13 个月和第 14 个月。我想用第 12 个月替换第 13 个月和第 14 个月。然后,最终将其转换为date_time格式。
Original_date
20190101
20191301
20191401
New_date
20190101
20191201
20191201
我尝试将格式替换为字符串,然后仅根据字符串 [4:6] 中的月份索引进行替换,但没有成功:
df.original_date.astype(str)
for string in df['original_date']:
if string[4:6]=="13" or string[4:6]=="14":
string.replace(string, string[:4]+ "12" + string[6:])
print(df['original_date'])
为什么不直接写一个正则表达式?
s = pd.Series('''20190101
20191301
20191401'''.split('\n')).astype(str)
s.str.replace('(?<=\d{4})(13|14)(?=01)', '12', regex=True)
产量:
0 20190101
1 20191201
2 20191201
dtype: object
(注意,您需要将输出重新分配回列以将其保存在内存中。)
您可以将 .str.replace
与正则表达式一起使用
df['New_date'] = df['Original_date'].astype(str).str.replace('(\d{4})(13|14)(\d{2})', r'\g<1>12', regex=True)
print(df)
Original_date New_date
0 20190101 20190101
1 20191301 20191201
2 20191401 20191201
您可以将替换和逻辑编写在一个单独的函数中,如果您还需要更改年或月,这也使您可以轻松调整它。 apply
允许您在 DataFrame 的每一行上使用该函数。
import pandas as pd
def split_and_replace(x):
year = x[0:4]
month = x[4:6]
day = x[6:8]
if month in ('13', '14'):
month = '12'
else:
pass
return year + month + day
df = pd.DataFrame(
data={
'Original_date': ['20190101', '20191301', '20191401']
}
)
res = df.Original_date.apply(lambda x: split_and_replace(x))
print(res)