Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 从奇数字典填充数据帧_Python 3.x_Pandas_Dictionary - Fatal编程技术网

Python 3.x 从奇数字典填充数据帧

Python 3.x 从奇数字典填充数据帧,python-3.x,pandas,dictionary,Python 3.x,Pandas,Dictionary,我有一本字典如下: {'header_1': ['body_1', 'body_3', 'body_2'], 'header_2': ['body_6', 'body_4', 'body_5'], 'header_4': ['body_7', 'body_8'], 'header_3': ['body_9'], 'header_9': ['body_10'], 'header_10': []} 我想提出这样一个数据框架: +----+----------+--------+ | ID

我有一本字典如下:

{'header_1': ['body_1', 'body_3', 'body_2'],
 'header_2': ['body_6', 'body_4', 'body_5'],
 'header_4': ['body_7', 'body_8'],
 'header_3': ['body_9'],
 'header_9': ['body_10'],
 'header_10': []}
我想提出这样一个数据框架:

+----+----------+--------+
| ID | header   | body   |
+----+----------+--------+
| 1  | header_1 | body_1 |
+----+----------+--------+
| 2  | header_1 | body_3 |
+----+----------+--------+
| 3  | header_1 | body_2 |
+----+----------+--------+
| 4  | header_2 | body_6 |
+----+----------+--------+
| 5  | header_2 | body_4 |
+----+----------+--------+
| 6  | header_2 | body_5 |
+----+----------+--------+
| 7  | header_4 | body_7 |
+----+----------+--------+
其中,空白项(如上述dict中的键
标题_10
)将接收值
None
。我已经尝试了多种不同的
df.loc
,例如:

for header_name, body_list in all_unique.items():
    for body_name in body_list:
        metadata.loc[metadata.index[-1]] = [header_name, body_name]
无济于事。当然,在
panadas
中必须有一种快速方法来追加行并自动增加索引?类似于SQL
INSERT INTO
语句的东西只使用pythonic代码

谢谢。

这又是另一个问题

借用Jez为您的
d

d = {k: v if bool(v) else [None] for k, v in d.items()}
首先将dict转换为数据帧

df=pd.Series(d).reset_index()
df.columns
Out[204]: Index(['index', 0], dtype='object')

然后在中使用此函数



如果数据集太大,这个解决方案会很慢,但它仍然可以工作

for key in data.keys():
    vals= data[key]
    # Create temp df with data from a single key
    t_df = pd.DataFrame({'header':[key]*len(vals),'body':vals})

    # Append it to your full dataframe.
    df = df.append(t_df)

对于空列表,使用dict CONTRUMENT添加
None
s,然后对元组列表使用扁平化:

d = {'header_1': ['body_1', 'body_3', 'body_2'],
 'header_2': ['body_6', 'body_4', 'body_5'],
 'header_4': ['body_7', 'body_8'],
 'header_3': ['body_9'],
 'header_9': ['body_10'],
 'header_10': []}

d = {k: v if bool(v) else [None] for k, v in d.items()}
data = [(k, y) for k, v in d.items() for y in v]
df = pd.DataFrame(data, columns= ['a','b'])
print (df)
            a        b
0    header_1   body_1
1    header_1   body_3
2    header_1   body_2
3    header_2   body_6
4    header_2   body_4
5    header_2   body_5
6    header_4   body_7
7    header_4   body_8
8    header_3   body_9
9    header_9  body_10
10  header_10     None
另一个解决方案:

data = []
for k, v in d.items():
    if bool(v):
        for y in v:
            data.append((k, y))
    else:
        data.append((k, None))


df = pd.DataFrame(data, columns= ['a','b'])
print (df)
            a        b
0    header_1   body_1
1    header_1   body_3
2    header_1   body_2
3    header_2   body_6
4    header_2   body_4
5    header_2   body_5
6    header_4   body_7
7    header_4   body_8
8    header_3   body_9
9    header_9  body_10
10  header_10     None

如果你只是把你的字典转换成熊猫可以事先处理的东西呢?那会很低效,你不觉得吗?它会引入额外的代码…比在每一步尝试重新分配整个数据帧效率更低?因为这就是附加在它后面的功能。为了比较,您有字典,它是一种专门设计用于高效变异的数据结构。代码越多并不意味着代码效率越低。@W-B我会再次发布这个答案。这正是我想要的needed@jezrael好的,让我删除我的答案。我认为这个答案仍然很有价值,因为它显示了另一种方法。但我更喜欢@jezrael的方法,因为它需要更少的行数code@user32882不用担心,他的答案肯定更好。我可以借用一下你为
d
做的设置吗?非常好/有创意的答案。您还可以使用
if v
而不是
if bool(v)
d = {'header_1': ['body_1', 'body_3', 'body_2'],
 'header_2': ['body_6', 'body_4', 'body_5'],
 'header_4': ['body_7', 'body_8'],
 'header_3': ['body_9'],
 'header_9': ['body_10'],
 'header_10': []}

d = {k: v if bool(v) else [None] for k, v in d.items()}
data = [(k, y) for k, v in d.items() for y in v]
df = pd.DataFrame(data, columns= ['a','b'])
print (df)
            a        b
0    header_1   body_1
1    header_1   body_3
2    header_1   body_2
3    header_2   body_6
4    header_2   body_4
5    header_2   body_5
6    header_4   body_7
7    header_4   body_8
8    header_3   body_9
9    header_9  body_10
10  header_10     None
data = []
for k, v in d.items():
    if bool(v):
        for y in v:
            data.append((k, y))
    else:
        data.append((k, None))


df = pd.DataFrame(data, columns= ['a','b'])
print (df)
            a        b
0    header_1   body_1
1    header_1   body_3
2    header_1   body_2
3    header_2   body_6
4    header_2   body_4
5    header_2   body_5
6    header_4   body_7
7    header_4   body_8
8    header_3   body_9
9    header_9  body_10
10  header_10     None