我有一个像这样的熊猫数据框(它是一个非常大的)
date exer exp ifor mat
1092 2014-03-17 American M 528.205 2014-04-19
1093 2014-03-17 American M 528.205 2014-04-19
1094 2014-03-17 American M 528.205 2014-04-19
1095 2014-03-17 American M 528.205 2014-04-19
1096 2014-03-17 American M 528.205 2014-05-17
Run Code Online (Sandbox Code Playgroud)
现在我想逐行迭代,当我遍历每一行时,每行的值ifor
可以根据某些条件改变,我需要查找另一个数据帧.
现在,我如何在迭代时更新它.尝试了一些他们都没有工作的事情.
for i, row in df.iterrows():
if <something>:
row['ifor'] = x
else:
row['ifor'] = y
df.ix[i]['ifor'] = x
Run Code Online (Sandbox Code Playgroud)
这些方法似乎都不起作用.我没有看到数据框中的值已更新.
这是一个自我回答的QnA,旨在指导用户应用的缺陷和好处.
我已经看到很多关于Stack Overflow问题的答案涉及使用apply.我也看到用户评论他们说" apply很慢",应该避免".
我已经阅读了很多关于性能主题的文章,解释apply很慢.我还在文档中看到了一个关于如何apply简单地传递UDF的便利函数的免责声明(现在似乎无法找到).因此,普遍的共识是,apply如果可能,应该避免.但是,这引发了以下问题:
apply是如此糟糕,那为什么它在API中呢?apply- 免费?apply是不错的(比其他可能的解决方案更好)?我想从一个空数据框开始,然后每次添加一行.我甚至可以从0数据帧开始data=pd.DataFrame(np.zeros(shape=(10,2)),column=["a","b"]),然后每次更换一行.
我怎样才能做到这一点?
我有一个df有 4 列的熊猫数据框 。例如,这是一个玩具示例:
foo1 foo2 foo3 foo4
egg cheese 2 1
apple pear 1 3
french spanish 10 1
Run Code Online (Sandbox Code Playgroud)
列是 foo1、foo2、foo3 和 foo4
我想交换列 foo1 和 foo2,并在 foo3 < foo4 时交换列 foo3 和 foo4。所以结果将是:
foo1 foo2 foo3 foo4
cheese egg 1 2
apple pear 1 3
spanish french 1 10
Run Code Online (Sandbox Code Playgroud)
我可以找到需要交换的行,df[df['foo3'] < df['foo4']] 但如何有效地进行交换。我的数据框很大。