如何使用 Python 上的循环将一行中的单元格从数据帧转换为字典? Pandas 相关
How to convert cells in a row from a dataframe to a dictionary using a loop on Python? Pandas related
假设我有以下 df
:
0 0 1 1 2 2 3 3 4 4 5 5
0 Fondo Oceano Cuerpo Cuerpo cangrejo Ojos Antenas Color Amarillo Pinzas None Puas None
1 Fondo Oceano Cuerpo Cuerpo cangrejo Ojos Antenas Color Amarillo Pinzas None Puas Arena
2 Fondo Oceano Cuerpo Cuerpo cangrejo Ojos Antenas Color Amarillo Pinzas None Puas Marron
3 Fondo Oceano Cuerpo Cuerpo cangrejo Ojos Antenas Color Amarillo Pinzas None Puas Purpura
4 Fondo Oceano Cuerpo Cuerpo cangrejo Ojos Antenas Color Amarillo Pinzas None Puas Verde
我知道我可以使用 Series.iteritems
这种方式来迭代此 df
中的特定行并打印特定行中每个单元格的内容(忽略索引列):
row = 0 #desired row
for _, e in df.iloc[row].iteritems():
print(e)
输出:
Fondo
Oceano
Cuerpo
Cuerpo cangrejo
Ojos
Antenas
Color
Amarillo
Pinzas
None
Puas
None
但我现在需要学习的是如何改进上面的循环,以便它创建一个包含 偶数单元格 的字典,如 keys
和 奇数单元格分别为values
?
换句话说,我怎样才能得到 0
行的以下字典作为输出?
the_dic = { 'Fondo':'Oceano',
'Cuerpo': 'Cuerpo cangrejo',
'Ojos': 'Antenas',
'Color': 'Amarillo',
'Pinzas': 'None',
'Puas': 'None'
}
PS:'None' 元素在这种情况下是一个 str
值而不是对象None
编辑:如果列名称中有 2 个重复值(如示例数据),则解决方案有效:
print (df.columns)
Int64Index([0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5], dtype='int64')
您可以在字典理解中使用转换第一个和第二个值的索引循环:
row = 0
d = {x.iat[0]: x.iat[1] for name, x in df.iloc[row].groupby(level=0)}
print (d)
{'Fondo': 'Oceano', 'Cuerpo': 'Cuerpo cangrejo', 'Ojos': 'Antenas', 'Color': 'Amarillo', 'Pinzas': 'None', 'Puas': 'None'}
或者过滤第一个和最后一个索引并添加 zip
和 dict
:
row = 0
s = df.iloc[row]
d = dict(zip(s[~s.index.duplicated()], s[~s.index.duplicated(keep='last')]))
print (d)
{'Fondo': 'Oceano', 'Cuerpo': 'Cuerpo cangrejo', 'Ojos': 'Antenas', 'Color': 'Amarillo', 'Pinzas': 'None', 'Puas': 'None'}
用于测试:
s = pd.Series(['Fondo', 'Oceano', 'Cuerpo', 'Cuerpo cangrejo', 'Ojos',
'Antenas', 'Color', 'Amarillo', 'Pinzas', 'None', 'Puas', 'None'],
index=[0,0,1,1,2,2,3,3,4,4,5,5])
print (s)
0 Fondo
0 Oceano
1 Cuerpo
1 Cuerpo cangrejo
2 Ojos
2 Antenas
3 Color
3 Amarillo
4 Pinzas
4 None
5 Puas
5 None
dtype: object
d = dict(zip(s[~s.index.duplicated(keep='last')], s[~s.index.duplicated()]))
print (d)
{'Oceano': 'Fondo', 'Cuerpo cangrejo': 'Cuerpo', 'Antenas': 'Ojos', 'Amarillo': 'Color', 'None': 'Puas'}
假设我有以下 df
:
0 0 1 1 2 2 3 3 4 4 5 5
0 Fondo Oceano Cuerpo Cuerpo cangrejo Ojos Antenas Color Amarillo Pinzas None Puas None
1 Fondo Oceano Cuerpo Cuerpo cangrejo Ojos Antenas Color Amarillo Pinzas None Puas Arena
2 Fondo Oceano Cuerpo Cuerpo cangrejo Ojos Antenas Color Amarillo Pinzas None Puas Marron
3 Fondo Oceano Cuerpo Cuerpo cangrejo Ojos Antenas Color Amarillo Pinzas None Puas Purpura
4 Fondo Oceano Cuerpo Cuerpo cangrejo Ojos Antenas Color Amarillo Pinzas None Puas Verde
我知道我可以使用 Series.iteritems
这种方式来迭代此 df
中的特定行并打印特定行中每个单元格的内容(忽略索引列):
row = 0 #desired row
for _, e in df.iloc[row].iteritems():
print(e)
输出:
Fondo
Oceano
Cuerpo
Cuerpo cangrejo
Ojos
Antenas
Color
Amarillo
Pinzas
None
Puas
None
但我现在需要学习的是如何改进上面的循环,以便它创建一个包含 偶数单元格 的字典,如 keys
和 奇数单元格分别为values
?
换句话说,我怎样才能得到 0
行的以下字典作为输出?
the_dic = { 'Fondo':'Oceano',
'Cuerpo': 'Cuerpo cangrejo',
'Ojos': 'Antenas',
'Color': 'Amarillo',
'Pinzas': 'None',
'Puas': 'None'
}
PS:'None' 元素在这种情况下是一个 str
值而不是对象None
编辑:如果列名称中有 2 个重复值(如示例数据),则解决方案有效:
print (df.columns)
Int64Index([0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5], dtype='int64')
您可以在字典理解中使用转换第一个和第二个值的索引循环:
row = 0
d = {x.iat[0]: x.iat[1] for name, x in df.iloc[row].groupby(level=0)}
print (d)
{'Fondo': 'Oceano', 'Cuerpo': 'Cuerpo cangrejo', 'Ojos': 'Antenas', 'Color': 'Amarillo', 'Pinzas': 'None', 'Puas': 'None'}
或者过滤第一个和最后一个索引并添加 zip
和 dict
:
row = 0
s = df.iloc[row]
d = dict(zip(s[~s.index.duplicated()], s[~s.index.duplicated(keep='last')]))
print (d)
{'Fondo': 'Oceano', 'Cuerpo': 'Cuerpo cangrejo', 'Ojos': 'Antenas', 'Color': 'Amarillo', 'Pinzas': 'None', 'Puas': 'None'}
用于测试:
s = pd.Series(['Fondo', 'Oceano', 'Cuerpo', 'Cuerpo cangrejo', 'Ojos',
'Antenas', 'Color', 'Amarillo', 'Pinzas', 'None', 'Puas', 'None'],
index=[0,0,1,1,2,2,3,3,4,4,5,5])
print (s)
0 Fondo
0 Oceano
1 Cuerpo
1 Cuerpo cangrejo
2 Ojos
2 Antenas
3 Color
3 Amarillo
4 Pinzas
4 None
5 Puas
5 None
dtype: object
d = dict(zip(s[~s.index.duplicated(keep='last')], s[~s.index.duplicated()]))
print (d)
{'Oceano': 'Fondo', 'Cuerpo cangrejo': 'Cuerpo', 'Antenas': 'Ojos', 'Amarillo': 'Color', 'None': 'Puas'}