将一组字典解析为单行熊猫(Python)
嗨,我有一个类似于下面的例子将一组字典解析为单行熊猫(Python),python,pandas,dataframe,Python,Pandas,Dataframe,嗨,我有一个类似于下面的例子 information record name apple size {'weight':{'gram':300,'oz':10.5},'description':{'height':10,'width':15}} country America partiesrelated [{'nameOfFarmer':'John Smith'},{'farmerID
information record
name apple
size {'weight':{'gram':300,'oz':10.5},'description':{'height':10,'width':15}}
country America
partiesrelated [{'nameOfFarmer':'John Smith'},{'farmerID':'A0001'}]
我想把df转换成另一个类似这样的df
information record
name apple
size_weight_gram 300
size_weight_oz 10.5
size_description_height 10
size_description_width 15
country America
partiesrelated_nameOfFarmer John Smith
partiesrelated_farmerID A0001
在这种情况下,字典将被解析为单行,其中size\u weight\u gram
并包含值
df的代码
df = pd.DataFrame({'information': ['name', 'size', 'country', 'partiesrealated'],
'record': ['apple', {'weight':{'gram':300,'oz':10.5},'description':{'height':10,'width':15}}, 'America', [{'nameOfFarmer':'John Smith'},{'farmerID':'A0001'}]]})
df = df.set_index('information')
IIUC,您可以定义一个递归函数来取消序列/指令的测试,直到您有一个键、值列表,该列表既可以作为
pd.DataFrame
构造函数的有效输入,也可以按照您描述的方式格式化
看看这个解决方案:
import itertools
import collections
ch = lambda ite: list(itertools.chain.from_iterable(ite))
def isseq(obj):
if isinstance(obj, str): return False
return isinstance(obj, collections.abc.Sequence)
def unnest(k, v):
if isseq(v): return ch([unnest(k, v_) for v_ in v])
if isinstance(v, dict): return ch([unnest("_".join([k, k_]), v_) for k_, v_ in v.items()])
return k,v
def pairwise(i):
_a = iter(i)
return list(zip(_a, _a))
a = ch([(unnest(k, v)) for k, v in zip(d['information'], d['record'])])
pd.DataFrame(pairwise(a))
0 1
0 name apple
1 size_weight_gram 300
2 size_weight_oz 10.5
3 size_description_height 10
4 size_description_width 15
5 country America
6 partiesrealated_nameOfFarmer John Smith
7 partiesrealated_farmerID A0001
由于该解决方案的递归性质,该算法可能无法达到任何深度。例如:
d={
'information': [
'row1',
'row2',
'row3',
'row4'
],
'record': [
'val1',
{
'val2': {
'a': 300,
'b': [
{
"b1": 10.5
},
{
"b2": 2
}
]
},
'val3': {
'a': 10,
'b': 15
}
},
'val4',
[
{
'val5': [
{
'a': {
'c': [
{
'd': {
'e': [
{
'f': 1
},
{
'g': 3
}
]
}
}
]
}
}
]
},
{
'b': 'bar'
}
]
]
}
0 1
0 row1 val1
1 row2_val2_a 300
2 row2_val2_b_b1 10.5
3 row2_val2_b_b2 2
4 row2_val3_a 10
5 row2_val3_b 15
6 row3 val4
7 row4_val5_a_c_d_e_f 1
8 row4_val5_a_c_d_e_g 3
9 row4_b bar
可能是重复的不,@Joost这是另一个问题。你的帖子是询问关于迭代行的问题。我的正在基于原始单行解析新行。新的列名是基于字典键和值给出的。您是对的,但您最初的措辞不够含糊,没有充分关注您的特定问题,看起来像是一个简单得多的问题。此外,如果您展示您已经尝试过的内容,我们将不胜感激。不管怎样,你编辑了你的答案,这样你的问题就更清楚了。谢谢你的回答,它完全符合我的要求:)