长列被误读成单独的行后如何合并/连接2行?

问题描述 投票:0回答:1

我的数据框有 3 列:

  • File-Name
  • Time Stamp
  • File Size

读取会添加文件名太长的行。对于每次出现这种情况,我需要:

  • 合并两行
  • 删除 None 和 NaN 值
  • 最后删除多余的行。

这里有第 20 行和第 21 行。第 21 行是文件路径和名称的多余部分:

20  ./.c9/dependencies/extensionHost/956a43f1ecc7f34424174768925cd9cc5a3e006d2ad71e6bd939f2a    2024-04-17 12:56    135268
21  None    NaN e04e9ef74933c4cab24ec0f62a973d0b06e59e466286a73382db011071887b5eafad4b8b9/package

它应该是这样的,并且再次为第 74 行生成了另一个额外行:

70  ./.nvm/versions/node/v20.12.0/include/node/ope...   2024-03-26 16:18    53440
71  ./.cache/node-gyp/18.19.0/include/node/openssl...   2024-03-06 19:24    53440
72  ./.nvm/versions/node/v20.11.1/include/node/ope...   2024-02-13 23:50    53440
73  ./.c9/node/include/node/openssl/archs   2023-11-29 14:59    53440
74  ./.c9/dependencies/node18-linux-x64/7e2ea6e5ed...   2023-11-29 14:59    53440
75  None    NaN 85de0311e77fec00f3ce2303de1affbe390e7b22b96402...

我正在尝试使用合并或组合所有具有 NaN 值的行。

python pandas join merge
1个回答
0
投票

选项 1(始终只有 one 尾随错误行)

最小可重现示例

import pandas as pd
import numpy as np

data = {'File-Name': {0: 'file', 1: None, 2: 'file2', 3: 'file', 4: None}, 
         'Time Stamp': {0: '2024-01-01 00:00:00', 1: np.nan, 2: '2024-01-01 00:00:00', 
                       3: '2024-01-01 00:00:00', 4: np.nan}, 
         'File Size': {0: 1, 1: '1_too_long', 2: 2, 3: 3, 4: '3_too_long'}
         }
df = pd.DataFrame(data)

df

  File-Name           Time Stamp   File Size
0      file  2024-01-01 00:00:00           1
1      None                  NaN  1_too_long
2     file2  2024-01-01 00:00:00           2
3      file  2024-01-01 00:00:00           3
4      None                  NaN  3_too_long

代码

out = (
    df.assign(**{'File-Name': (df['File-Name'] + (df['File Size']
                                                  .where(df['File-Name'].isna())
                                                  .shift(-1)
                                                  .fillna(''))
                               )
                 }
              )
    .dropna(subset='File-Name')
    .reset_index(drop=True)
)

输出

        File-Name           Time Stamp File Size
0  file1_too_long  2024-01-01 00:00:00         1
1           file2  2024-01-01 00:00:00         2
2  file3_too_long  2024-01-01 00:00:00         3

解释


选项 2

(可能存在多个尾随错误行) 如果文件名太长以致有多个尾随行,选项 1 将无法按预期工作。在这种情况下,我们可以使用

df.reset_index


样品

df.groupby

代码

data2 = {'File-Name': {0: 'file', 1: None, 2: 'file2', 3: 'file', 4: None, 5: None}, 'Time Stamp': {0: '2024-01-01 00:00:00', 1: np.nan, 2: '2024-01-01 00:00:00', 3: '2024-01-01 00:00:00', 4: np.nan, 5: np.nan}, 'File Size': {0: 1, 1: '1_too_long', 2: 2, 3: 3, 4: '3_way', 5: '_too_long'} } df2 = pd.DataFrame(data2) df2 File-Name Time Stamp File Size 0 file 2024-01-01 00:00:00 1 1 None NaN 1_too_long 2 file2 2024-01-01 00:00:00 2 3 file 2024-01-01 00:00:00 3 4 None NaN 3_way # multiple rows 5 None NaN _too_long # multiple rows

输出

gr = df2['File-Name'].notna().cumsum() out2 = ( df2.assign(**{'File-Name': df2['File-Name'].where(df2['File-Name'].notna(), df2['File Size']) } ) .groupby(gr, as_index=False) .agg({'File-Name': lambda x: ''.join(x), 'Time Stamp': 'first', 'File Size': 'first'}) )

解释

使用
© www.soinside.com 2019 - 2024. All rights reserved.