我們需要將其展平為標準的 2D DataFrame:
arr = [
[{ 'id': 3, 'abbr': 'ORL', 'record': { 'win': 3, 'loss': 7 }},
{ 'id': 5, 'abbr': 'ATL', 'record': { 'win': 3, 'loss': 7 }}],
[{ 'id': 7, 'abbr': 'NYK', 'record': { 'win': 3, 'loss': 7 }},
{ 'id': 9, 'abbr': 'BOS', 'record': { 'win': 3, 'loss': 7 }}]
]
pd.DataFrame(data = {'name': ['nick', 'tom'], 'arr': arr })
這是我們的代碼,它適用于這個虛擬示例
for i in range(len(mydf)):
output_list = []
for i in range(len(mydf)):
team1 = mydf['arr'][i][0]
team2 = mydf['arr'][i][1]
zed = { 't1': team1['abbr'], 't2': team2['abbr'] }
output_list.append(zed)
output_df = pd.DataFrame(output_list)
final_df = pd.concat([mydf, output_df], axis=1)
final_df.pop('arr')
final_df
name t1 t2
0 nick ORL ATL
1 tom NYK BOS
我們的資料來源不可靠并且可能存在缺失值,而且我們的代碼似乎充滿了結構性缺陷。特別是,當其中任何一個是原始資料(缺少欄位,缺少字典)時,都會引發錯誤:
# missing dict
arr = [
[{ 'id': 3, 'abbr': 'ORL', 'record': { 'win': 3, 'loss': 7 }}],
[{ 'id': 7, 'abbr': 'NYK', 'record': { 'win': 3, 'loss': 7 }},
{ 'id': 9, 'abbr': 'BOS', 'record': { 'win': 3, 'loss': 7 }}]
]
mydf = pd.DataFrame(data = {'name': ['nick', 'tom'], 'arr': arr })
# missing "abbr" field
arr = [
[{ 'id': 3, 'record': { 'win': 3, 'loss': 7 }},
{ 'id': 5, 'abbr': 'ATL', 'record': { 'win': 3, 'loss': 7 }}],
[{ 'id': 7, 'abbr': 'NYK', 'record': { 'win': 3, 'loss': 7 }},
{ 'id': 9, 'abbr': 'BOS', 'record': { 'win': 3, 'loss': 7 }}]
]
mydf = pd.DataFrame(data = {'name': ['nick', 'tom'], 'arr': arr })
是否可以 (a) 用結構更合理的方法 (apply) 替換 for 回圈,以及 (b) 處理丟失的資料問題?
uj5u.com熱心網友回復:
您的代碼的主要問題是“abbr”鍵可能不存在。您可以使用dict.get方法來解釋該問題。如果您更換:
zed = { 't1': team1['abbr'], 't2': team2['abbr'] }
和
zed = { 't1': team1.get('abbr', np.nan), 't2': team2.get('abbr', np.nan) }
它將按預期作業。
另一種不使用顯式回圈的方法:
你可以explode和領域str.get;abbr將其轉換為串列;用它構建一個 DataFrame 并join回傳到df:
df = pd.DataFrame(data = {'name': ['nick', 'tom'], 'arr': arr })
out = (df.join(pd.DataFrame((df['arr']
.explode()
.str.get('abbr')
.groupby(level=0)
.agg(list)
.tolist()),
columns=['t1','t2'], index=df.index))
.drop(columns='arr')
.fillna(np.nan))
對于適用于您的代碼的示例:
name t1 t2
0 nick ORL ATL
1 tom NYK BOS
對于第一個不起作用的樣本:
name t1 t2
0 nick ORL NaN
1 tom NYK BOS
對于第二個不起作用的示例:
name t1 t2
0 nick NaN ATL
1 tom NYK BOS
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/425108.html
上一篇:在java中的陣列中列印最大數量
