[英]Pandas : Converting Dataframe upper triangular to lower and vice versa
[英]Converting pandas dataframe to dict and vice versa
我有一個名為df
的pandas.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
的值。 這些鍵與包含col2
和col3
值的 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
值的那個)? 另外,請隨時幫助我改進從df
到data
的轉換。
編輯: 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.