【问题标题】:move column above and delete rows in pandas python dataframe在pandas python数据框中移动列并删除行
【发布时间】:2021-08-26 20:15:17
【问题描述】:

我有一个这样的数据框 df

A        B        C        D        E        F        G        H
a.1      b.1     
                  
                  c.1      d.1 
                  c.2      d.2           e.1      f.1 
                                                      

                                                     g.1       h.1
  


创建示例数据帧

from io import StringIO

s = """A,B,C,D,E,F,G,H
a.1,b.1,,,,,,
,,c.1,d.1,,,,
,,c.2,d.2,e.1,f.1,,
,,,,,,g.1,h.1"""

df = pd.read_csv(StringIO(s))

我想删除这些额外的空格,并且我希望数据框从第一行开始。谁能帮忙。

我想要的结果是

A        B        C        D        E        F        G        H
a.1      b.1      c.1      d.1      e.1      f.1      g.1       h.1
                  c.2      d.2                                                   

【问题讨论】:

标签: python python-3.x pandas dataframe python-2.7


【解决方案1】:

您可以通过first_valid_index 找到的前面缺失值的数量向后移动每一列:

df.apply(lambda s: s.shift(-s.first_valid_index()))

得到

     A    B    C    D    E    F    G    H
0  a.1  b.1  c.1  d.1  e.1  f.1  g.1  h.1
1  NaN  NaN  c.2  d.2  NaN  NaN  NaN  NaN
2  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
3  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN

删除充满NaNs 的行并用空字符串填充其余行:

out = (df.apply(lambda s: s.shift(-s.first_valid_index()))
         .dropna(how="all")
         .fillna(""))

得到

>>> out

     A    B    C    D    E    F    G    H
0  a.1  b.1  c.1  d.1  e.1  f.1  g.1  h.1
1            c.2  d.2

注意:这假设您的索引是0..N-1;所以如果不是,你可以预先存储它然后恢复:

index = df.index
df = df.reset_index(drop=True)
df = (df.apply(lambda s: s.shift(-s.first_valid_index()))
        .dropna(how="all")
        .fillna(""))
df.index = index[:len(df)]

要使上拉特定于某些列:

def pull_up(s):
    # this will be a column number; `s.name` is the column name
    col_index = df.columns.get_indexer([s.name])

   # for example: if `col_index` is either 7 or 8, pull by 4
   if col_index in (7, 8):
       return s.shift(-4)
   else:
       # otherwise, pull as much
       return s.shift(-s.first_valid_index())

# applying
df.apply(pull_up)

【讨论】:

  • 嗯,对不起,我没有提到这个数据是示例数据,不同列的实际数据索引是不同的。基本上,在第 3,4 列中,我需要向上移动 1 个选项卡...5,6 需要向上移动 2 个选项卡....7,8 需要向上拉 3 个选项卡,第 9,10 列需要向上移动 4标签
  • @sdave 是的,在这种情况下,您可以将最后一个 sn-p 与 reset_index 一起使用;你能试试吗?
  • 是的,我现在就做,我的问题是我可以简单地使用 df['c'] 而不是 df['c'] 来仅在特定列上工作吗?跨度>
  • @sdave 当然,它应该是这样工作的。
  • 在 first_valid_index 是第 0 列或我们有第一个非 NaN 值的情况下,它可以完美地工作。 df.iloc[:, 6:8]=df.iloc[:, 6:8].apply(lambda s: s.shift(-s.first_valid_index())) 但对于第 7 列和第 8 列,我有多个 NaN 值,直到第 50 行,但我只想将它向上拉 4 行。基本上,该列应以 NaN 值开头,但应删除前 4 行,并将数据拉到上方。有什么方法可以定义什么(行列组合)应该是第一个有效索引?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 2018-10-17
  • 1970-01-01
  • 2022-12-17
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
相关资源
最近更新 更多