【问题标题】:Concat successive rows in pandas based on regex基于正则表达式连接熊猫中的连续行
【发布时间】:2020-05-12 12:21:35
【问题描述】:

我有一个包含 date 的以下数据框被扭曲了。

index   Date    Particulars
0       01-12-  AVON AGRO
1       2018    NaN
2       01-12-  CASH
3       2018    NaN
4       03-12-  NEFTOut/UTBIN18337459966/LUNI
5       2018    A MARKETING/SBIN00019
6       03-12-  ANJANI TRADERS
7       2018    NaN
8       03-12-  NEFTOut/UTBIN18337484160/BIGS
9       2018    MILE PRODUCTS/UTIB000

但我想要以下输出:

index   Date        Particulars
0       01-12-2018  AVON AGRO
2       01-12-2018  CASH
4       03-12-2018  NEFTOut/UTBIN18337459966/LUNIA MARKETING/SBIN00019
6       03-12-2018  ANJANI TRADERS
8       03-12-2018  NEFTOut/UTBIN18337484160/BIGSMILE PRODUCTS/UTIB000

我试过df.apply(lambda x: x if re.search('\d{4}$', str(x)) else str(x.shift(-1)) + str(x)),但它给了我:

Date           0         2018\n1       01-12-\n2         2018...
Particulars    0                                 NaN\n1      ...
dtype: object

【问题讨论】:

    标签: string pandas dataframe rows concat


    【解决方案1】:

    首先将缺失值替换为空字符串,然后通过groupbyjoin 连接inpair 和pair rows:

    df1 = df.fillna('').groupby(df.index // 2).agg(''.join)
    print (df1)
                 Date                                        Particulars
    index                                                               
    0      01-12-2018                                          AVON AGRO
    1      01-12-2018                                               CASH
    2      03-12-2018  NEFTOut/UTBIN18337459966/LUNIA MARKETING/SBIN0...
    3      03-12-2018                                     ANJANI TRADERS
    4      03-12-2018  NEFTOut/UTBIN18337484160/BIGSMILE PRODUCTS/UTI...
    

    或按位置选择配对和取消配对:

    df1 = df.fillna('')
    df1 = df1.iloc[::2].reset_index(drop=True) + df1.iloc[1::2].reset_index(drop=True)
    print (df1)
             Date                                        Particulars
    0  01-12-2018                                          AVON AGRO
    1  01-12-2018                                               CASH
    2  03-12-2018  NEFTOut/UTBIN18337459966/LUNIA MARKETING/SBIN0...
    3  03-12-2018                                     ANJANI TRADERS
    4  03-12-2018  NEFTOut/UTBIN18337484160/BIGSMILE PRODUCTS/UTI...
    

    也可以使用正则表达式解决:

    df1 = df.fillna('')
    m = df1['Date'].str.contains('\d{4}$')
    df1 = df1[m.shift(-1).fillna(False)].reset_index(drop=True) + df1[m].reset_index(drop=True)
    

    【讨论】:

    • 非常感谢。我喜欢正则表达式的解决方案,因为它对我有用。
    猜你喜欢
    • 2020-11-14
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 2017-03-12
    • 2021-07-20
    • 2017-07-24
    相关资源
    最近更新 更多