我的資料框有一列串列,但為了簡單起見,讓我們使用系列 (v)。每個串列都包含我要創建的字典的值。
v = pd.Series(data=([10, 20], [10,20,30], [50]), index=['a','b','c'])
所有字典都需要具有相同的鍵 (k)。
k = [2022, 2023, 2024]
如何創建字典列?結果看起來像這個系列(d):
d = pd.Series(data=({2022:10, 2023:20, 2024:np.NaN},
{2022:10, 2023:20, 2024:30},
{2022:50, 2023:np.NaN, 2024:np.NaN}), index=['a','b','c'])
uj5u.com熱心網友回復:
使用itertools.zip_longest:
from itertools import zip_longest
d = pd.Series(dict(zip_longest(k, x, fillvalue=np.nan)) for x in v)
輸出:
0 {2022: 10, 2023: 20, 2024: nan}
1 {2022: 10, 2023: 20, 2024: 30}
2 {2022: 50, 2023: nan, 2024: nan}
dtype: object
編輯
保持索引:
d = pd.Series([dict(zip_longest(k,x, fillvalue=np.nan)) for x in v], index=v.index)
在 DataFrame 中:
df['new_col'] = [dict(zip_longest(k, x, fillvalue=np.nan)) for x in df['col']]
uj5u.com熱心網友回復:
采用:
d = \
pd.Series({key: {k1 : value[i] if i < len(value) else np.nan
for i, k1 in enumerate(k)}
for key, value in v.items()})
#0 {2022: 10, 2023: 20, 2024: nan}
#1 {2022: 10, 2023: 20, 2024: 30}
#2 {2022: 50, 2023: nan, 2024: nan}
#dtype: object
或與Series.apply
v.apply(lambda l_values: {k1 : l_values[i] if i < len(l_values) else np.nan
for i, k1 in enumerate(k)})
uj5u.com熱心網友回復:
使用itertools.zip_longest Series.apply
from itertools import zip_longest
res = v.apply(lambda vals: dict(zip_longest(k, vals, fillvalue=np.nan)))
或不使用itertools
def make_dict(vals, keys):
d = dict.fromkeys(keys, np.nan)
for key, val in zip(keys, vals):
d[key] = val
return d
res = v.apply(make_dict, keys=k)
輸出:
>>> res
0 {2022: 10, 2023: 20, 2024: nan}
1 {2022: 10, 2023: 20, 2024: 30}
2 {2022: 50, 2023: nan, 2024: nan}
dtype: object
設定:
import pandas as pd
import numpy as np
v = pd.Series(([10, 20], [10,20,30], [50]))
k = [2022, 2023, 2024]
uj5u.com熱心網友回復:
請試試這個:
import numpy as np
def create_dict(ls):
dict_ls = {}
for i,value in enumerate(k):
try:
dict_ls.update({value:ls[i]})
except:
dict_ls.update({value:np.nan})
return dict_ls
d = v.apply(lambda x:create_dict(x))
uj5u.com熱心網友回復:
這是一種間接的方法,不是我想的最好的
import pandas as pd
import numpy as np
v = pd.Series(([10, 20], [10,20,30], [50]))
k = [2022, 2023, 2024]
首先,我使用正確的鍵值對創建一個元組串列
c = [[(k_, v__) for k_, v__ in zip(k, v_ [np.NAN]*(len(k)-len(v_)))] for v_ in v]
然后我可以將其轉換為字典串列并將其傳遞給pd.Series
def convert_to_col(col):
d = {}
for itm in col:
d[itm[0]] = itm[1]
return d
d = pd.Series([convert_to_col(c_) for c_ in c])
如果我沒記錯的話你想要這個
0 {2022: 10, 2023: 20, 2024: nan}
1 {2022: 10, 2023: 20, 2024: 30}
2 {2022: 50, 2023: nan, 2024: nan}
dtype: object
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/448675.html
