我有一個這樣的資料框
import pandas as pd
df = pd.DataFrame(
{
'C1': list('aabbab'),
'C2': list('abbbaa'),
'value': range(11, 17)
}
)
C1 C2 value
0 a a 11
1 a b 12
2 b b 13
3 b b 14
4 a a 15
5 b a 16
我想生成這樣的字典:
{'C1': {'a': {1: 11, 2: 12, 3: 15}, 'b': {1: 13, 2: 14, 3: 16}},
'C2': {'a': {1: 11, 2: 15, 3: 16}, 'b': {1: 12, 2: 13, 3: 14}}}
邏輯如下:
在df我轉到列C1中,a我在列中找到的第一個對應于 value 11,第二個對應于 value ,12第三個對應于15。的位置a和對應的值應該存盤在鍵C1和的字典中a。
我可以做這樣的事情
df_ss = df.loc[df['C1'] == 'a', 'value']
d = {ind: val for ind, val in enumerate(df_ss.values, 1)}
產生d:
{1: 11, 2: 12, 3: 15}
這確實是所需的輸出。然后我可以把它放到一個回圈中并生成所有需要的字典。
有沒有人看到比這更有效的東西?
uj5u.com熱心網友回復:
您可以使用 groupby 和嵌套的 dict 理解:
import pandas as pd
df = pd.DataFrame(
{
'C1': list('aabbab'),
'C2': list('abbbaa'),
'value': range(11, 17)
}
)
d = {
c: {k: dict(enumerate(g["value"], 1)) for k, g in df.groupby(c)}
for c in ["C1", "C2"]
}
哪個輸出:
{'C1': {'a': {1: 11, 2: 12, 3: 15}, 'b': {1: 13, 2: 14, 3: 16}},
'C2': {'a': {1: 11, 2: 15, 3: 16}, 'b': {1: 12, 2: 13, 3: 14}}}
uj5u.com熱心網友回復:
groupby對每個 C 值使用字典理解enumerate:
cols = ['C1', 'C2']
# or, programmatically
# cols = df.filter(regex='^C').columns
out = {c: {k: dict(enumerate(g, start=1)) for k,g in df.groupby(c)['value']}
for c in cols}
輸出:
{'C1': {'a': {1: 11, 2: 12, 3: 15}, 'b': {1: 13, 2: 14, 3: 16}},
'C2': {'a': {1: 11, 2: 15, 3: 16}, 'b': {1: 12, 2: 13, 3: 14}}}
uj5u.com熱心網友回復:
這可能比@mozway 和@Alex 方法慢一點:
{
c: df.set_index([df.groupby(c).cumcount() 1, c])["value"]
.unstack(0)
.to_dict("index")
for c in ["C1", "C2"]
}
輸出:
{'C1': {'a': {1: 11, 2: 12, 3: 15}, 'b': {1: 13, 2: 14, 3: 16}},
'C2': {'a': {1: 11, 2: 15, 3: 16}, 'b': {1: 12, 2: 13, 3: 14}}}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/436184.html
上一篇:Python-將值拆分為兩個整數
