如何解决在特定条件下连接python
- 已编辑
我想编写一个带条件的If循环,该条件对连接字符串具有条件。 即,如果单元格A1包含特定格式的文本,则仅您可以串联,否则保留原样。
示例: 如果帐单号如下所示:CM2 / 0000 /,则将该字符串与日期列(月-年)连接起来,否则将帐单号保持不变。
解决方法
也许这对您有用。像@ Mike67这样的数据样本会很好。但是根据您的信息,这就是我的想法。笨拙,但有效。我敢肯定其他人会有更好的版本。
import pandas as pd
from pandas import DataFrame,Series
dat = {'num': ['CM2/0000/','CM2/0000','CM3/0000/','CM3/0000',],'date': ['15/09/19','15/09/19','15/09/19']}
df = pd.DataFrame(dat)
df['date'] = df['date'].map(lambda x: str(x)[3:])
df['date'] = df['date'].str.replace('/','-')
for cols in df.columns:
df.loc[df['num'].str.endswith('/'),cols] = df['num'] + df['date']
print(df)
Results:
num date
0 CM2/0000/09-19 09-19
1 CM2/0000 09-19
2 CM3/0000/09-19 09-19
3 CM3/0000 09-19
,
您可以创建执行所需功能的函数,并使用df.apply()
在所有行上执行它。
我使用@Boomer答案中的示例数据。
编辑:您没有显示数据框中的实际内容,并且似乎在datetime
中有bill_date
,但是我使用了字符串。我必须将字符串转换为datetime
,以显示如何使用它。现在,它需要.strftime('%m-%y')
或有时需要.dt.strftime('%m-%y')
而不是.str[3:].str.replace('/','-')
。由于熊猫使用不同的格式来显示不同国家的日期,因此我无法使用str(x)
,因为它给了我2019-09-15 00:00:00
而不是您的15/09/19
import pandas as pd
df = pd.DataFrame({
'bill_number': ['CM2/0000/','CM3/0000'],'bill_date': ['15/09/19','15/09/19']
})
df['bill_date'] = pd.to_datetime(df['bill_date'])
def convert(row):
if row['bill_number'].endswith('/'):
#return row['bill_number'] + row['bill_date'].str[3:].replace('/','-')
return row['bill_number'] + row['bill_date'].strftime('%m-%y')
else:
return row['bill_number']
df['bill_number'] = df.apply(convert,axis=1)
print(df)
结果:
bill_number bill_date
0 CM2/0000/09-19 15/09/19
1 CM2/0000 15/09/19
2 CM3/0000/09-19 15/09/19
3 CM3/0000 15/09/19
第二个想法是创建蒙版
mask = df['bill_number'].str.endswith('/')
然后将其用于所有值
#df.loc[mask,'bill_number'] = df[mask]['bill_number'] + df[mask]['bill_date'].str[3:].str.replace('/','-')
df.loc[mask,'bill_number'] = df[mask]['bill_number'] + df[mask]['bill_date'].dt.strftime('%m-%y')
或
#df.loc[mask,'bill_number'] = df.loc[mask,'bill_number'] + df.loc[mask,'bill_date'].str[3:].str.replace('/','bill_date'].dt.strftime('%m-%y')
左侧需要.loc[mask,'bill_number']
而不是`[mask] ['bill_number']才能正确分配值-右侧则不需要。
import pandas as pd
df = pd.DataFrame({
'bill_number': ['CM2/0000/','15/09/19']
})
df['bill_date'] = pd.to_datetime(df['bill_date'])
mask = df['bill_number'].str.endswith('/')
#df.loc[mask,'-')
# or
#df.loc[mask,'-')
df.loc[mask,'bill_number'] = df[mask]['bill_number'] + df[mask]['bill_date'].dt.strftime('%m-%y')
#or
#df.loc[mask,'bill_date'].dt.strftime('%m-%y')
print(df)
第三个想法是使用numpy.where()
import pandas as pd
import numpy as np
df = pd.DataFrame({
'bill_number': ['CM2/0000/','15/09/19']
})
df['bill_date'] = pd.to_datetime(df['bill_date'])
df['bill_number'] = np.where(
df['bill_number'].str.endswith('/'),#df['bill_number'] + df['bill_date'].str[3:].str.replace('/','-'),df['bill_number'] + df['bill_date'].dt.strftime('%m-%y'),df['bill_number'])
print(df)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。