簡體   English   中英

將 pandas dataframe 轉換為字典,反之亦然

[英]Converting pandas dataframe to dict and vice versa

我有一個名為dfpandas.DataFrame (這只是一個例子)

col1  col2  col3
  A1    B1    C1
 NaN    B2   NaN
 NaN    B3   NaN
  A2    B4    C2
 Nan    B5    C3
  A3    B6    C4
 NaN   NaN    C5

dataframe是排序的,每個NaN都是col1 ,可以認為是一個單元格,包含列中最后一個有效值。 我通過使用獲得了這個:

df[["col1"]] = df[["col1"]].fillna(method="ffill")

這使:

col1  col2  col3
  A1    B1    C1
  A1    B2   NaN
  A1    B3   NaN
  A2    B4    C2
  A2    B5    C3
  A3    B6    C4
  A3   NaN    C5

然后,我獲得一個dict ,它的鍵是col1的值。 這些鍵與包含col2col3值的 dict 相關聯:

data = {
    "A1": {"col2": ["B1", "B2", "B3"], "col3": ["C1"]},
    "A2": {"col2": ["B4", "B5"], "col3": ["C2", "C3"]},
    "A3": {"col2": ["B6"], "col3": ["C4", "C5"]}
}

我通過以下方式獲得data

data = {val: {"col2": group["col2"].dropna().tolist(),
              "col3": group["col3"].dropna().tolist()}
        for val, group in df.groupby("col1")}

這是從 dataframe df轉換為 dict data的最終結果。 我無法實現的是如何做相反的事情。 如果給定data ,我如何構建最初的df (在col1中也包含NaN值的那個)? 另外,請隨時幫助我改進從dfdata的轉換。

編輯: df包含 data 中每個val的 max(len( data max(len(data[val]["col2"]), len(data[val]["col3"]))行。 如果需要NaN值來填充行,它們必須位於最后位置。 例如:

data = {
    "A1": {"col1": ["B1"], "col2": ["C1", "C2"]}
}

變成

col1  col2  col3
  A1    B1    C1
  A1   NaN    C2

並不是

col1  col2  col3
  A1   NaN    C1
  A1    B1    C2

我們可以在連接期間使用cumcount單獨分解每一列以對齊。 col1然后需要在它被復制的地方被屏蔽。

import pandas as pd

df = pd.DataFrame.from_dict(data, orient='index')
df.index.name='col1'

l = []
for col in ['col2', 'col3']:
    s = df.explode(col)
    s['idx'] = s.groupby(level=0).cumcount()
    s = s.set_index('idx', append=True)
    l.append(s[col])

df = pd.concat(l, axis=1)

df = df.reset_index().drop(columns='idx')
df['col1'] = df['col1'].mask(df['col1'].duplicated())

  col1 col2 col3
0   A1   B1   C1
1  NaN   B2  NaN
2  NaN   B3  NaN
3   A2   B4   C2
4  NaN   B5   C3
5   A3   B6   C4
6  NaN  NaN   C5

暫無
暫無

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

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