将元组分配给pandas中的单元格

时间:2017-02-20 22:35:49

标签: python pandas format tuples assign

我有一个这样的数据框:

date    time    job.filename    job.id  1,3,5-trimethylbenzene  1,3-butadiene   1,4-diaminobutane   1,5-diaminopentane  1,5-pentanedial 1-butanamine    ... nitrosopiperidine   nitrosopyrrolidine  pentanal    propanal    propylbenzene   propylene glycol methyl ether acetate   styrene tetrahydropyrrole   toluene xylenes + ethylbenzene
0   20161214    75506   IMAT list 1-3581-0-20161214-075506.csv  3581    NaN 0.1914  NaN NaN NaN NaN ... 0.5742  NaN NaN NaN NaN NaN NaN 0.3631  NaN NaN
1   20161214    80856   IMAT list 1-3585-0-20161214-080856.csv  3585    NaN 0.2353  NaN NaN NaN NaN ... 12.8760 NaN NaN NaN NaN NaN NaN 1.0447  NaN NaN

我想将时间分配给每个值并形成一个元组:

date    time    job.filename    job.id  1,3,5-trimethylbenzene  1,3-butadiene   1,4-diaminobutane   1,5-diaminopentane  1,5-pentanedial 1-butanamine    ... nitrosopiperidine   nitrosopyrrolidine  pentanal    propanal    propylbenzene   propylene glycol methyl ether acetate   styrene tetrahydropyrrole   toluene xylenes + ethylbenzene
0   20161214    75506   IMAT list 1-3581-0-20161214-075506.csv  3581    NaN (0.1914,75506)  NaN NaN NaN NaN ... (0.5742,75506)  NaN NaN NaN NaN NaN NaN (0.3631,75506)  NaN NaN
1   20161214    80856   IMAT list 1-3585-0-20161214-080856.csv  3585    NaN (0.2353,80856)  NaN NaN NaN NaN ... 12.8760 NaN NaN NaN NaN NaN NaN 1.0447  NaN NaN

我试过

headers=new.columns.tolist()
for i, row in new.iterrows():
    val=row[headers[4:]].get_values()
    time=row['time']
    k=[(value,time) for value in val]
    new.set_value(i,headers[4:],k)

但我收到了这个 ValueError:使用ndarray

设置时必须具有相等的len键和值

可能是由于格式改变的事实。我可以修改我的系列格式以使其工作吗?

干杯

1 个答案:

答案 0 :(得分:2)

我不需要显式迭代 - 您可以直接将时间压缩到使用df.apply索引的值列。例如,

>>> df
     time vals1  vals2          vals3
0  332903   foo      4  <class 'int'>
1   42930   bar      3  <class 'str'>

>>> df.iloc[:, 1:] = df.iloc[:,1:].apply(lambda x: list(zip(df.time, x)))

>>> df
     time          vals1        vals2                    vals3
0  332903  (332903, foo)  (332903, 4)  (332903, <class 'int'>)
1   42930   (42930, bar)   (42930, 3)   (42930, <class 'str'>)