从奇数字典中填充pandas数据帧

use*_*882 2 dictionary python-3.x pandas

我有一本字典如下:

{'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': []}
Run Code Online (Sandbox Code Playgroud)

我想提出一个这样的数据帧:

+----+----------+--------+
| 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 |
+----+----------+--------+
Run Code Online (Sandbox Code Playgroud)

空白项目(例如header_10上面的dict中的键)将获得值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]
Run Code Online (Sandbox Code Playgroud)

无济于事.当然必须有一种快速的方法panadas来追加行并自动增加索引?类似于SQL INSERT INTO语句的东西只使用pythonic代码?

谢谢.

jez*_*ael 6

使用dict comprehension为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
Run Code Online (Sandbox Code Playgroud)

另一种方案:

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
Run Code Online (Sandbox Code Playgroud)

  • 我可以借用你的'd`设置吗? (3认同)