我正在使用熊猫,并且有一个看起来像这样的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
然后将索引更改为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
我不确定它是否可以实现。请给我一些有关如何实现这一点的想法。
答案 0 :(得分:0)
执行此操作的方法有几种,以下是有关如何实现建议的方法的一些想法。
第1步:
使用str.isalpha()
方法检查字符串是否仅包含字母字符:
df["column"].apply(lambda x: x if x.isalpha() else None)
以上将返回Series
列中的数值为“无”的ID
。您可以将其存储在新列中。
此解决方案假定每个x
是一个字符串。
如果您不确定列中的所有数字都是字符串,则可以创建城市列表:
my_cities = ['Melbourne', 'Sydney']
然后检查列中的值是否为城市,并将其存储在布尔值Series
中:
is_city = df['column'].isin(my_cities)
应用Series
作为掩码,并将值替换为None
:
df.loc[~is_city, 'column'] = None
(请注意~
的意思是“不是”,因此这将返回值“不是城市”的行)。
第2步:
使用ffill
方法填充新列:
df["new_column"].fillna(method="ffill")
ffill
基本上执行问题的第3步。您可以here来了解它。
第3步:
最后删除所有至少包含一个None
的行:
df.dropna()