【问题标题】:Remove empty cells and move content to the left Python删除空单元格并将内容移动到左侧 Python
【发布时间】:2022-02-10 04:04:18
【问题描述】:

我有一个 Excel 文件,其中包含以下没有标题或索引的结构 - 我只添加了 Excel 中的列标题,而我的表中没有:

A B C D E ... J K
ABC XLS 1231341231 123123asdad1923 NaN NaN ... 123123asdad1923
DEF XLS 1231231231 1231823asda9123 NaN askda213 ... 123123asdad1923
XYZ XLS 1231231233 2138820394832sd NaN NaN ... asdasdq2ew12332

我需要删除所有包含NaN 的单元格,当为 NaN 时,将单元格向左移动。

输出应如下所示:

A B C D E ... J K
ABC XLS 1231341231 123123asdad1923 123123asdad1923
DEF XLS 1231231231 1231823asda9123 askda213 ... 123123asdad1923
XYZ XLS 1231231233 2138820394832sd asdasdq2ew12332

我发现 this similar question 在 Stackoverflow 上掉线了,但答案没有做任何改变:

import pandas as pd

df = pd.read_excel('test.xlsx')
df = df.apply(lambda x: pd.Series(x.dropna().values))
df = df.fillna('')

df.to_excel("test_modified.xlsx", index=False, header=False)

任何想法如何实现这一目标?

谢谢。

【问题讨论】:

  • 是否会有多个连续的 NaN 序列?例如a b NaN NaN c d NaN NaN?
  • 在您的情况下“不工作”是什么意思?从输入到输出没有变化?一个错误?还有什么?
  • @richardec:感谢您的回复。它是完全动态的——我们可以有a NaN b NaN,甚至可以有a b c NaN NaN NaN
  • @BigBen:感谢您的回复。它没有改变任何东西。
  • @richardec:是的,没错

标签: python excel pandas


【解决方案1】:

我想到的一个解决方案是,对于每一行,使用自定义排序函数对行进行排序,该函数为 NaN 返回 0,为非 NaN 返回 1,有效地移动(但不改变顺序)所有非 NaN 值是连续的,并在最后留下 NaN:

new_df = df.apply(lambda row: pd.Series(sorted(row.tolist(), key=lambda x: np.isnan(x) if isinstance(x, float) else 0), index=row.index), axis=1)

输出:

>>> new_df
     A    B           C                D                E                J   K
0  ABC  XLS  1231341231  123123asdad1923  123123asdad1923              NaN NaN
1  DEF  XLS  1231231231  1231823asda9123         askda213  123123asdad1923 NaN
2  XYZ  XLS  1231231233  2138820394832sd  asdasdq2ew12332              NaN NaN

【讨论】:

  • @richarddec:谢谢,这正是我所需要的。
【解决方案2】:

好的,那我建议转置数据集,处理它,然后转置回来。

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {
        "A": ["ABC", "DEF", "XYZ"],
        "B": ["XLS", "XLS", "XLS"],
        "C": ["1231341231", "1231231231", "1231231233"],
        "D": ["123123asdad1923", "1231823asda9123", "2138820394832sd"],
        "E": [np.nan, np.nan, np.nan],
        "F": [np.nan, "askda213", np.nan],
        "I": ["blabla", "blabla", np.nan],
        "K": ["123123asdad1923", "123123asdad1923", "asdasdq2ew12332"],
    }
)

print(df)
# transpose
df_transposed = df.T
# move NaN at end of column
df_transposed = df_transposed.apply(lambda x: pd.Series(x.dropna().values))
# replace Nan by empty strings
df_transposed.replace(np.nan, "", inplace=True)
# transpose back
df = df_transposed.T
print()
print(df)

将输出:

     A    B           C                D   E         F       I                K
0  ABC  XLS  1231341231  123123asdad1923 NaN       NaN  blabla  123123asdad1923
1  DEF  XLS  1231231231  1231823asda9123 NaN  askda213  blabla  123123asdad1923
2  XYZ  XLS  1231231233  2138820394832sd NaN       NaN     NaN  asdasdq2ew12332

     0    1           2                3                4                5                6
0  ABC  XLS  1231341231  123123asdad1923           blabla  123123asdad1923                 
1  DEF  XLS  1231231231  1231823asda9123         askda213           blabla  123123asdad1923
2  XYZ  XLS  1231231233  2138820394832sd  asdasdq2ew12332                                  

【讨论】:

  • @Thomas Ulrich:感谢您的回复。您的代码完全删除了 Word2 列,这不是我想要的。您的示例与我提出的示例不太一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-07
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
相关资源
最近更新 更多