我在pandas列的每个单元格中都有任意数量的词典列表。
df['Amenities'][0]
[{'Description': 'Basketball Court(s)'},
{'Description': 'Bike Rack / Bike Storage'},
{'Description': 'Bike Rental'},
{'Description': 'Business Center'},
{'Description': 'Clubhouse'},
{'Description': 'Community Garden'},
{'Description': 'Complex Wifi '},
{'Description': 'Courtesy Patrol/Officer'},
{'Description': 'Dog Park'},
{'Description': 'Health Club / Fitness Center'},
{'Description': 'Jacuzzi'},
{'Description': 'Pet Friendly'},
{'Description': 'Pet Park / Dog Run'},
{'Description': 'Pool'}]
我想做以下事情。
1)遍历字典列表,解压缩它们并创建值为1的列(Amenities退出)。
2)在随后的迭代中,检查列标签是否已存在,然后将1作为值添加到单元格,如果不存在则创建一个新列。
3)用0填充其余的列。
基本上,我正在尝试创建包含字典列表中的值0和1的要素。
下面的代码基于dict值创建新的列,但是围绕检查该列是否存在,创建不存在的新列以及分配1和0的部分需要一些思考。
for i, row in df.iterrows():
dict_obj = row['Amenities']
for key, val in dict_obj.items():
if val in df.columns:
df.loc[i, val] = 1
else
.......
预期结果如下:
答案 0 :(得分:2)
您的代码是一个很好的起点,而且非常接近!
正如您所说,您需要遍历字典。解决方案是使用<?php
require 'function.ipinc.php';
require 'function.ipdec.php';
print("Increment:\n");
for ($i = 0, $ip = "100.0.0.0"; $i <= 16777215; $i++) {
print("$ip\n");
$ip = ipinc($ip);
}
print("----------\n");
print("Decrement:\n");
for ($i = 0, $ip = "100.255.255.255"; $i <= 16777215; $i++) {
print("$ip\n");
$ip = ipdec($ip);
}
print("----------\n");
die("Finished!\n");
?>
在数据框上创建新列(针对当前正在处理的便利设施)(如果尚不存在),或者使用它设置其值。
.loc
简短说明:
import pandas as pd
df = pd.DataFrame(
{
"Amenities": [
[
{"Description": "Basketball Court(s)"},
{"Description": "Bike Rack / Bike Storage"},
{"Description": "Bike Rental"},
],
[
{"Description": "Basketball Court(s)"},
{"Description": "Courtesy Patrol/Officer"},
{"Description": "Dog Park"},
],
]
}
)
for i, row in df.iterrows():
amenities_list = row["Amenities"]
for amenity in amenities_list:
for k, v in amenity.items():
df.loc[i, v] = 1
df = df.drop(columns="Amenities")
df = df.fillna(0).astype({i: "int" for i in df.columns})
是行索引,i
是便利设施的名称(字符串)。 v
接受行索引,列索引,如果还没有列索引,则创建一个新列。
在for循环之后,我们只删除不再需要的“ Amentities”列,将所有NA值替换为0,然后将所有列转换为整数(NA值仅针对浮点数存在,因此默认情况下,它们是浮点数开头)。
答案 1 :(得分:2)
一种方法是先explode
列“设施”,然后创建一个数据框,在该列上使用str.get_dummies
,在level = 0上使用sum
,例如:
#data example
df = pd.DataFrame({
'Amenities': [
[{'Description': 'Basketball Court(s)'},
{'Description': 'Bike Rental'}],
[{'Description': 'Basketball Court(s)'},
{'Description': 'Clubhouse'},
{'Description': 'Community Garden'}]
]})
# explode
s = df['Amenities'].explode()
# create dataframe, use get_dummies and sum on the level=0 of index
df_ = pd.DataFrame(s.tolist(), s.index)['Description'].str.get_dummies().sum(level=0)
print (df_)
Basketball Court(s) Bike Rental Clubhouse Community Garden
0 1 1 0 0
1 1 0 1 1