我有一个如下所示的数据帧:
print(df):
# Output
Text
0 Melbourne. Adelaide. Brisbane.
1 Sydney. Adelaide. Gold Coast.
2 Gold Coast. Brisbane. Melbourne.
3 Sydney. Melbourne. Brisbane.
我还有一本字典
print(dict):
{'VIC': ['Melbourne'], 'SA': ['Adelaide'], 'QLD': ['Brisbane','Gold Coast'], 'NSW': ['Sydney']}
我尝试创建的输出是:
print(df):
Text VIC SA QLD NSW
0 Melbourne. Adelaide. Brisbane. Melbourne. Adelaide. Brisbane.
1 Sydney. Adelaide. Gold Coast. Adelaide. Gold Coast. Sydney.
2 Gold Coast. Brisbane. Melbourne. Melbourne. Brisbane.
3 Sydney. Melbourne. Brisbane. Melbourne. Adelaide. Brisbane.
当两个项目出现在同一个州(如df index 2
)时,我想展示布里斯班而不是黄金海岸,因为它首先出现在dict
我使用了以下代码,如果找到字符串,则可以将1或0放入其中:
for index in df.index:
for key, s_elements in dict.items():
df.at[index, key] = (lambda: 1 if any([s in df['Text'][index] for s in s_elements]) else 0)()
打印(df):
Text VIC SA QLD NSW
0 Melbourne. Adelaide. Brisbane. 1 1 1 0
1 Sydney. Adelaide. Gold Coast. 1 1 1
2 Gold Coast. Brisbane. Melbourne. 1 0 1 0
3 Sydney. Melbourne. Brisbane. 1 0 1 1
这很有效,但我正在尝试获取ComColumn中找到的城市名称(使用每个键中的第一个元素)
有人能帮我做些什么调整,让名字显示出来,而不是数字吗?我尝试了lambda: s_elements
而不是lambda: 1
,但得到了ValueError: Must have equal len keys and value when setting with an iterable
任何帮助都会很棒!非常感谢
另一种尝试是:从pandas中取出数据,进行清理,然后将其拉回到数据帧中。因为它是字符串,所以它应该是快速的。但是两次?嗯。不管怎样,这里有:
这不是一项容易的任务,但有一种方法是首先为
extractall
编译正则表达式模式:这将提供
(Melbourne)|(Adelaide)|(Brisbane|Gold Coast)|(Sydney)
,但您还希望Brisbane
优先于Gold Coast
,这将需要此模式:无论如何,无论使用哪种模式,您都可以使用
str.extractall
获得匹配项,使用groupby
和first
展平行,然后使用原始dfconcat
并重命名列:相关问题 更多 >
编程相关推荐