使用 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
然后把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
然后是这样的
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
最后更改列名并删除没有值的行
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 一个 Series
,ID
列中的数值为 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()
我正在使用 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
然后把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
然后是这样的
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
最后更改列名并删除没有值的行
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 一个 Series
,ID
列中的数值为 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()