使用 pandas python 重新排列 csv 中的行值

rearrange rows values in csv using pandas python

我正在使用 pandas 并且有一个看起来像这样的 csv 文件

  ID                Name        Store      Price           
Melbourne           
    1               aaaa        bbbb        570
    2               cccc        dddd        236
    3               eeee        ffff        230
Sydney
    1               hhhh        gggg        2300
    2               kkkk        llll        266

我想要这个形状的

City            ID               Name        Store       Price      
Melbourne        1               aaaa        bbbb        570
Melbourne        2               cccc        dddd        236
Melbourne        3               eeee        ffff        230
Sydney           1               hhhh        gggg        23
Sydney           2               kkkk        llll        266

我的想法是
1. 新增一列

  ID        New               Name        Store      Price           
Melbourne   NaN  
    1       NaN               aaaa        bbbb        570
    2       NaN               cccc        dddd        236
    3       NaN               eeee        ffff        230
Sydney 
    1       NaN               hhhh        gggg        2300
    2       NaN               kkkk        llll        266
  1. 然后把index改成ID。所以它看起来像这样

      ID       New      Name        Store      Price           
     Melbourne NaN  
     1         NaN      aaaa        bbbb        570
     2         NaN      cccc        dddd        236
     3         NaN      eeee        ffff        230
     Sydney    NaN
     1         NaN      hhhh        gggg        2300
     2         NaN      kkkk        llll        266
    
  2. 然后是这样的

      ID         New              Name        Store      Price           
     Melbourne   NaN  
     Melbourne    1               aaaa        bbbb        570
     Melbourne    2               cccc        dddd        236
     Melbourne    3               eeee        ffff        230
     Sydney       NaN
     Sydney       1               hhhh        gggg        2300
     Sydney       2               kkkk        llll        266
    
  3. 最后更改列名并删除没有值的行

    City            ID              Name        Store      Price           
    Melbourne       1               aaaa        bbbb        570
    Melbourne       2               cccc        dddd        236
    Melbourne       3               eeee        ffff        230
    Sydney          1               hhhh        gggg        2300
    Sydney          2               kkkk        llll        266
    

    不知道能不能实现。请给我一些关于如何实现它的想法。

有几种方法可以做到这一点,下面是关于如何实施您提出的方法的一些想法。

第 1 步:

使用str.isalpha()方法检查字符串是否只包含字母字符:

df["column"].apply(lambda x: x if x.isalpha() else None)

上面将 return 一个 SeriesID 列中的数值为 None。您可以将其存储在新列中。

此解决方案假定每个 x 都是一个字符串。


如果您不确定列中的所有数字都是字符串,您可以创建一个城市列表:

my_cities = ['Melbourne', 'Sydney']

然后检查您的列中的值是否为城市并将其存储在布尔值中 Series:

is_city = df['column'].isin(my_cities)

Series 用作掩码,并将值替换为 None:

df.loc[~is_city, 'column'] = None

(请注意,~ 表示 "not",因此这将 return 行,其中值 "is not a city")。

第 2 步:

使用 ffill 方法填充新列:

df["new_column"].fillna(method="ffill")

ffill 基本上完成了您问题中的第 3 步。你可以阅读它 here.

第 3 步:

最后删除包含至少一个 None:

的所有行
df.dropna()