根据特定条件连接 python

Concatenate on specific condition 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','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 answer 的示例数据。

编辑: 你没有在数据框中显示你真正拥有的东西,似乎你在 bill_date 中有 datetime 但我使用了字符串。我不得不将字符串转换为 datetime 以展示如何使用它。现在它需要 .strftime('%m-%y') 或有时 .dt.strftime('%m-%y') 而不是 .str[3:].str.replace('/','-')。因为 pandas 使用不同的格式来显示不同国家的 dateitm 所以我不能为此使用 str(x) 因为它给我 2019-09-15 00:00:00 而不是你的 15/09/19

import pandas as pd

df = pd.DataFrame({
    'bill_number': ['CM2/0000/', 'CM2/0000', 'CM3/0000/', 'CM3/0000'],
    'bill_date': ['15/09/19', '15/09/19', '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('/','-')
 df.loc[mask,'bill_number'] = df.loc[mask,'bill_number'] + df.loc[mask,'bill_date'].dt.strftime('%m-%y')

左侧需要 .loc[mask,'bill_number'] 而不是 `[mask]['bill_number'] 来正确评估值 - 但右侧不需要它。

import pandas as pd

df = pd.DataFrame({
    'bill_number': ['CM2/0000/', 'CM2/0000', 'CM3/0000/', 'CM3/0000'],
    'bill_date': ['15/09/19', '15/09/19', '15/09/19', '15/09/19']
})
df['bill_date'] = pd.to_datetime(df['bill_date'])

mask = df['bill_number'].str.endswith('/')

#df.loc[mask,'bill_number'] = df[mask]['bill_number'] + df[mask]['bill_date'].str[3:].str.replace('/','-')
# or
#df.loc[mask,'bill_number'] = df.loc[mask,'bill_number'] + df.loc[mask,'bill_date'].str[3:].str.replace('/','-')

df.loc[mask,'bill_number'] = df[mask]['bill_number'] + df[mask]['bill_date'].dt.strftime('%m-%y')
#or
#df.loc[mask,'bill_number'] = df.loc[mask,'bill_number'] + 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/', 'CM2/0000', 'CM3/0000/', 'CM3/0000'],
    'bill_date': ['15/09/19', '15/09/19', '15/09/19', '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)