微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在特定条件下连接python

如何解决在特定条件下连接python

  • 已编辑

我想编写一个带条件的If循环,该条件对连接字符串具有条件。 即,如果单元格A1包含特定格式的文本,则仅您可以串联,否则保留原样。

示例: 如果帐单号如下所示:CM2 / 0000 /,则将该字符串与日期列(月-年)连接起来,否则将帐单号保持不变。

Sample Data

解决方法

也许这对您有用。像@ 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 举报,一经查实,本站将立刻删除。