【问题标题】:Shifting cells to up in Pandas dataframe在 Pandas 数据框中将单元格向上移动
【发布时间】:2021-10-14 09:58:49
【问题描述】:

我有一个包含一些杂乱数据的 csv 文件。

我在 pandas 中有以下数据框

Name Age Sex Salary Status
John 32 Nan NaN NaN
Nan Male 4000 Single NaN
May 20 Female 5000 Married
teresa 45

期望的输出:

   Name   Age     Sex Salary  Status
0  John   32    Male   4000  Single
1   May   20  Female   5000  Married
2  teresa 45

那么有谁知道如何用 Pandas 做到这一点?

【问题讨论】:

  • 也许你应该修复你的文件。能否更新一下您的 csv 文件示例?
  • @TõnisPiip 这是我拥有的数据,是的,4000 在性别下,在“薪水”下是单身。是的,可以删除第二行我只想将值向上移动
  • @TõnisPiip - 这就是问题所在。如果您有一个损坏的导入以及其他 nan 值弄乱了您的列,您该怎么办。

标签: python pandas dataframe


【解决方案1】:

您可以使用一些 numpy 魔法来删​​除 NaN 并重塑底层数组:

a = df.replace({'Nan': float('nan')}).values.flatten()
pd.DataFrame(a[~pd.isna(a)].reshape(-1, len(df.columns)),
             columns=df.columns)

输出:

   Name Age     Sex Salary   Status
0  John  32    Male   4000   Single
1   May  20  Female   5000  Married

【讨论】:

  • 我已经尝试过这个解决方案,我得到了这个错误ValueError: cannot reshape array of size 2234 into shape (5)
  • 那么请提供一个不起作用的例子
  • @EvgenyTanhilevich 你能详细说明这个错误吗?关于 NaN 的位置,从示例来看,它们似乎从左到右然后从上到下移动,如果有其他逻辑,那么这是一个不可能解决的问题
  • @EvgenyTanhilevich - 此解决方案可以正常工作并给出正确的结果(并且应该适用于具有类似结构的数据帧)。你在哪里发现了一个错误?对于提供的示例,您的解决方案仍然给出不同的结果。
  • @Prestige 你能提供数据集吗?这可能意味着您没有所有数据,在这种情况下,您可以用 NaN 填充最后的值以获得len(df.column) 的倍数的形状,但这可能只是意味着存在任意缺失值在这种情况下,您所要求的数据集是不可能毫无歧义地实现的
【解决方案2】:

试试groupby:

>>> df.groupby(df['Name'].notna().cumsum()).apply(lambda x: x.apply(lambda x: next(iter(x.dropna()), np.nan))).reset_index(drop=True)
   Name Age     Sex  Salary   Status
0  John  32    4000  Single      NaN
1   May  20  Female    5000  Married
>>> 

【讨论】:

  • 这不会产生预期的输出,你在这个过程中失去了价值;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 2013-12-04
  • 1970-01-01
  • 2018-08-13
  • 2014-11-17
相关资源
最近更新 更多