if用于Python中熊猫数据帧的语句

时间:2015-10-20 12:02:23

标签: python pandas

我有一个如下所示的数据框:

timestamp                      0            1            2            3                                           
2013-04-17 05:00:00     4.335212  2655.140854  2655.140854  2655.140854   
2013-04-17 05:10:00     2.224966  2655.140854  2655.140854  2655.140854   
2013-04-17 05:20:00     2.409150  2655.140854  2655.140854  2655.140854   
2013-04-17 05:30:00  2655.140854  2655.140854  2655.140854  2655.140854 

我需要对数据框中的每个值强加if语句标准,我尝试过使用:

dirt = dirt.astype(float)
for ind, i in enumerate(dirt):
    if i < 0:
        dirt[ind] = i + 360
    if i > 360:
        dirt[ind] = i - 360

但是,任何值都不会发生加法和减法。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您应该使用.iterrows()代替enumerate(df)。执行enumerate(df)时,您只需获取不符合条件的列名称。 iterrows()每次迭代都会返回索引和行(作为pandas.Series)。

但是根据您的要求,您可以迭代df.columns并以矢量化方式为每列执行所需操作。示例 -

for col in df.columns:
    df.loc[df[col] < 0,col] += 360
    df.loc[df[col] > 360,col] -= 360

我正在使用columns而不是rows,假设列数远小于行数,因此我们将以更少的迭代次数进行实际循环(并使用向量化)同时添加更多数据)。

演示 -

In [128]: df
Out[128]:
                               0            1            2            3
timestamp
2013-04-17 05:00:00     4.335212  2655.140854  2655.140854  2655.140854
2013-04-17 05:10:00     2.224966  2655.140854  2655.140854  2655.140854
2013-04-17 05:20:00     2.409150  2655.140854  2655.140854  2655.140854
2013-04-17 05:30:00  2655.140854  2655.140854  2655.140854  2655.140854

In [134]: for col in df.columns:
   .....:     df.loc[df[col] < 0,col] += 360
   .....:     df.loc[df[col] > 360,col] -= 360
   .....:

In [135]: df
Out[135]:
                               0            1            2            3
timestamp
2013-04-17 05:00:00     4.335212  2295.140854  2295.140854  2295.140854
2013-04-17 05:10:00     2.224966  2295.140854  2295.140854  2295.140854
2013-04-17 05:20:00     2.409150  2295.140854  2295.140854  2295.140854
2013-04-17 05:30:00  2295.140854  2295.140854  2295.140854  2295.140854

答案 1 :(得分:3)

您可以使用whereupdate屏蔽来更新现有的数据帧值,如下所示:

In [188]: df
Out[188]: 
                              0            1            2            3
timestamp                                                             
2013-04-1705:00:00     4.335212  2655.140854  2655.140854  2655.140854
2013-04-1705:10:00     2.224966  2655.140854  2655.140854  2655.140854
2013-04-1705:20:00     2.409150  2655.140854  2655.140854  2655.140854
2013-04-1705:30:00  2655.140854  2655.140854  2655.140854  2655.140854

In [189]: df_small = df.where(df < 0).apply(lambda x: x + 360)

In [190]: df_small
Out[190]: 
                     0   1   2   3
timestamp                         
2013-04-1705:00:00 NaN NaN NaN NaN
2013-04-1705:10:00 NaN NaN NaN NaN
2013-04-1705:20:00 NaN NaN NaN NaN
2013-04-1705:30:00 NaN NaN NaN NaN

In [191]: df_large = df.where(df > 360).apply(lambda x: x - 360)

In [192]: df_large
Out[192]: 
                              0            1            2            3
timestamp                                                             
2013-04-1705:00:00          NaN  2295.140854  2295.140854  2295.140854
2013-04-1705:10:00          NaN  2295.140854  2295.140854  2295.140854
2013-04-1705:20:00          NaN  2295.140854  2295.140854  2295.140854
2013-04-1705:30:00  2295.140854  2295.140854  2295.140854  2295.140854
In [193]: df.update(df_small)

In [194]: df.update(df_large)

In [195]: df
Out[195]: 
                              0            1            2            3
timestamp                                                             
2013-04-1705:00:00     4.335212  2295.140854  2295.140854  2295.140854
2013-04-1705:10:00     2.224966  2295.140854  2295.140854  2295.140854
2013-04-1705:20:00     2.409150  2295.140854  2295.140854  2295.140854
2013-04-1705:30:00  2295.140854  2295.140854  2295.140854  2295.140854

注意:

如果您碰巧遇到以下情况,这将有可能迎合极端情况:&#34;价值&#34; &LT; 360然后+360否则-360但更新的顺序将导致重新应用结果,即。 1 + 360 = 361,然后361> 360因此再次变为1。

但是对于你的用例,我认为@AnandSKumar的方法非常干净,接近你正在寻找的东西。