【问题标题】:Edit pandas dataframe row-by-row逐行编辑熊猫数据框
【发布时间】:2014-01-08 15:17:10
【问题描述】:

python 的 pandas 很整洁。我正在尝试用熊猫数据框替换字典列表。但是,我想知道有没有一种方法可以像在 for 循环中那样简单地逐行更改值?

这是非熊猫的字典版本:

trialList = [
    {'no':1, 'condition':2, 'response':''},
    {'no':2, 'condition':1, 'response':''},
    {'no':3, 'condition':1, 'response':''}
]  # ... and so on

for trial in trialList:
    # Do something and collect response
    trial['response'] = 'the answer!'

...现在trialList 包含更新的值,因为trial 引用了它。非常便利!但是字典列表非常不方便,特别是因为我希望能够按列计算熊猫擅长的东西。

因此,鉴于上面的 trialList,我虽然可以通过类似 pandas 的操作来使它变得更好:

import pandas as pd    
dfTrials = pd.DataFrame(trialList)  # makes a nice 3-column dataframe with 3 rows

for trial in dfTrials.iterrows():
   # do something and collect response
   trials[1]['response'] = 'the answer!'

...但trialList 在这里保持不变。有没有一种简单的方法来逐行更新值,也许相当于 dict-version?重要的是,它是逐行的,因为这是一个实验,其中向参与者展示了许多试验,并且每次试验都会收集各种数据。

【问题讨论】:

    标签: python pandas trial


    【解决方案1】:

    如果你真的想要逐行操作,你可以使用iterrowsloc

    >>> for i, trial in dfTrials.iterrows():
    ...     dfTrials.loc[i, "response"] = "answer {}".format(trial["no"])
    ...     
    >>> dfTrials
       condition  no  response
    0          2   1  answer 1
    1          1   2  answer 2
    2          1   3  answer 3
    
    [3 rows x 3 columns]
    

    更好的是当你可以矢量化时:

    >>> dfTrials["response 2"] = dfTrials["condition"] + dfTrials["no"]
    >>> dfTrials
       condition  no  response  response 2
    0          2   1  answer 1           3
    1          1   2  answer 2           3
    2          1   3  answer 3           4
    
    [3 rows x 4 columns]
    

    而且总是有apply

    >>> def f(row):
    ...     return "c{}n{}".format(row["condition"], row["no"])
    ... 
    >>> dfTrials["r3"] = dfTrials.apply(f, axis=1)
    >>> dfTrials
       condition  no  response  response 2    r3
    0          2   1  answer 1           3  c2n1
    1          1   2  answer 2           3  c1n2
    2          1   3  answer 3           4  c1n3
    
    [3 rows x 5 columns]
    

    【讨论】:

    • 谢谢!最上面的是我需要的。不像我想要的那么漂亮/简单,但它确实有效。
    • @Jonas 关键是矢量化解决方案总是最快的。逐行迭代是(通常可以避免)。
    • 在我的例子中,数据会随着受试者进行实验而逐次更新,并且需要在收集所有数据之前“在线”完成分析。因此一次对所有行进行操作是不可能的。
    猜你喜欢
    • 1970-01-01
    • 2019-03-17
    • 2019-12-02
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    相关资源
    最近更新 更多