如何使用 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'}

或者过滤第一个和最后一个索引并添加 zipdict:

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'}