簡體   English   中英

我怎樣才能 append 字典的每個鍵和值到列?

[英]How can I append each key and value of dictionary to columns?

在 Python 中,我有一個 dataframe 具有 json 變量。

例如,如果列的鍵和值如下:

{'a': 3, 'b': 2, 'c': 1}
{'d': 287, 'e': 56, 'f': 17, 'g': 9}
{'h': 22, 'i': 15, 'a': 7}
{'g': 17, 'd': 15, 'e': 15, 'f': 7, 'h': 15}

我想 append 列就像

key_1 value_1 key_2 value_2 key_3 value_3 key_4 value_4 key_5 value_5
a      3       b      2       c      1
d      287     e      56      f      17     g      9
h      22      i      15      a       7       
g      17      d      15      e      15     f      7      h      15

IE,

  1. 一對生成兩列。 (核心價值_)

  2. 每行都有不同數量的鍵值對。

  3. 雖然鍵相同,但鍵的值可以不同。

  4. 雖然鍵不同,但鍵的值可以相同。

  5. 我只需要制作最多 600 列(300 對 * 2)。

嘗試:

# if type of the column is string, convert it to python object first:

#from ast import literal_eval
#df["column"] = df["column"].apply(literal_eval)

x = (
    df["column"]
    .apply(
        lambda x: {
            f"{k}{i}": v
            for i, t in enumerate(x.items(), 1)
            for k, v in zip(["key_", "value_"], t)
        },
    )
    .to_list()
)

print(pd.DataFrame(x).fillna(""))

印刷:

  key_1  value_1 key_2  value_2 key_3  value_3 key_4 value_4 key_5 value_5
0     a        3     b        2     c        1                            
1     d      287     e       56     f       17     g     9.0              
2     h       22     i       15     a        7                            
3     g       17     d       15     e       15     f     7.0     h    15.0

Dataframe 使用:

                                         column
0                      {'a': 3, 'b': 2, 'c': 1}
1          {'d': 287, 'e': 56, 'f': 17, 'g': 9}
2                    {'h': 22, 'i': 15, 'a': 7}
3  {'g': 17, 'd': 15, 'e': 15, 'f': 7, 'h': 15}

為了好玩(作為“挑戰”,我會在現實生活中使用類似於@Andrej 的方法,這種方法更簡潔高效),這是一個純粹的 pandas 解決方案:

s = df['col'].apply(list).explode().rename('key')
idx = pd.MultiIndex.from_arrays([s.index, s])

(pd
 .json_normalize(df['col']).stack()
 .to_frame(name='value')
 .reindex(idx)
 .assign(pos=lambda d: d.groupby(level=0).cumcount().add(1))
 .reset_index()
 .pivot(index='level_0', columns='pos')
 .sort_index(level=1, axis=1, sort_remaining=False)
 .pipe(lambda d: d.set_axis(d.columns.map(lambda x: f'{x[0]}_{x[1]}'), axis=1))
)

output:

        key_1  value_1 key_2  value_2 key_3  value_3 key_4  value_4 key_5  value_5
level_0                                                                           
0           a      3.0     b      2.0     c      1.0   NaN      NaN   NaN      NaN
1           d    287.0     e     56.0     f     17.0     g      9.0   NaN      NaN
2           h     22.0     i     15.0     a      7.0   NaN      NaN   NaN      NaN
3           g     17.0     d     15.0     e     15.0     f      7.0     h     15.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM