我有一个在pandas系列中逐行嵌套的键值对。什么是将它们分成单个列的最有效/最优化的方法? (我可以解压缩并进行转换,但最好的方式是什么?)
我 不 知道:
行是unicode字符串列表。一旦提取,值将始终是bigint。
输入:
parsedSeries.head()
0 [key1=774, key2=238]
1 [key1=524, key2=101, key3=848]
2 [key3=843]
3 [key1=232, key3=298, key2=457]
预期产出:
record key1 key2 key3
0 774 238 NAN
1 524 101 848
2 NAN NAN 843
3 232 457 298
请注意,输入包含包含格式为u"X=Y"
的Unicode字符串的列表,其中假定X
符合用作Python中属性名称的任何必需约定,{{1始终可以解释为整数。例如,以下内容可用于构建上述示例数据:
Y
答案 0 :(得分:2)
" best"解决方案可能首先不会发现自己处于这种情况。大多数情况下,当你在系列或数据框架中有非标量数量时,你已经朝错误的方向迈出了一步,因为你无法真正应用向量操作。
无论如何,从你的系列开始,你可以这样做:
>>> ds = [dict(w.split('=', 1) for w in x) for x in s]
>>> pd.DataFrame.from_records(ds)
key1 key2 key3
0 774 238 NaN
1 524 101 848
2 NaN NaN 843
3 232 457 298
答案 1 :(得分:1)
好的,你的最终答案可能因你的例子有多精确而有所不同。具体而言,可以调整解析数据的正则表达式。
让我们做一些imoprts并设置你的数据文件:
import re
import pandas as pd
from StringIO import StringIO
f = StringIO("""0 [key1=774, key2=238]
1 [key1=524, key2=101, key3=848]
2 [key3=843]
3 [key1=232, key3=298, key2=457]""")
现在我们已经准备好开始了。首先只是一些正则表达式魔术来获得行的dict表示:
# get the dicts
rows = [dict(re.findall('(key[0-9]*)=([0-9]*)',l)) for l in f]
# convert values to ints
rows = [dict((k,int(v)) for k,v in row.items()) for row in rows]
rows
输出:
[{'key1': 774, 'key2': 238},
{'key1': 524, 'key2': 101, 'key3': 848},
{'key3': 843},
{'key1': 232, 'key2': 457, 'key3': 298}]
那只是正则表达式,但你就在那里:
pd.DataFrame(rows)
输出:
key1 key2 key3
0 774 238 NaN
1 524 101 848
2 NaN NaN 843
3 232 457 298
如果您愿意,可以转换为单行,但我将其分为两步,以便您可以调整正则表达式以适合您的实际数据文件。
答案 2 :(得分:1)
对DSM使用from_records
进行非常轻微的调整,以便将值作为整数而不是字符串进行处理。
def key_to_int(split_vals):
return (split_vals[0], int(split_vals[1]))
def dictify(row):
return dict(key_to_int(elem.split("=")) for elem in row)
pandas.DataFrame.from_records(parsedSeries.map(dictify))
给出
Out[518]:
key1 key2 key3
0 774 238 NaN
1 524 101 848
2 NaN NaN 843
3 232 457 298
[4 rows x 3 columns]
其中值为整数(由于float
值导致列仍然是NaN
类型,并且NumPy仍然不支持整数NaN值。