【发布时间】:2014-10-22 22:18:58
【问题描述】:
如何转换此数据帧
位置值 0(美国弗吉尼亚州里士满)100 1 (纽约市, 纽约, 南, 美国) 200到这里:
城市 州 地区 国家 价值 0 里士满弗吉尼亚州南美国 100 1 纽约市 纽约南美国 200请注意,第一个数据框中的 location 列包含元组。我想从location 列中创建四列。
【问题讨论】:
如何转换此数据帧
位置值 0(美国弗吉尼亚州里士满)100 1 (纽约市, 纽约, 南, 美国) 200到这里:
城市 州 地区 国家 价值 0 里士满弗吉尼亚州南美国 100 1 纽约市 纽约南美国 200请注意,第一个数据框中的 location 列包含元组。我想从location 列中创建四列。
【问题讨论】:
new_col_list = ['city','state','regions','country']
for n,col in enumerate(new_col_list):
df[col] = df['location'].apply(lambda location: location[n])
df = df.drop('location',axis=1)
【讨论】:
如果您返回一系列(拆分)位置,您可以将生成的 DF 直接与您的值列合并(join 到 merge on index)。
addr = ['city', 'state', 'region', 'country']
df[['value']].join(df.location.apply(lambda loc: Series(loc, index=addr)))
value city state region country
0 100 Richmond Virginia NaN USA
1 200 New York City New York NaN USA
【讨论】:
df 的索引是range(len(df)) 时才有效,对吧?
join 是合并索引与两个帧的简写,因此索引只需要保持一致(它会在这里,因为应用和 col 选择不会影响它)。我会编辑答案。
我没有计时,但我建议这个选项:
df.loc[:,'city']=df.location.map(lambda x:x[0])
df.loc[:,'state']=df.location.map(lambda x:x[1])
df.loc[:,'regions']=df.location.map(lambda x:x[2])
df.loc[:,'country']=df.location.map(lambda x:x[3])
我猜测避免显式 for 循环可能适合 SIMD 指令(当然 numpy 会寻找它,但可能不是其他库)
【讨论】: