我有一个如下所示的数据框:
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
但是,任何值都不会发生加法和减法。有什么想法吗?
答案 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)
您可以使用where和update屏蔽来更新现有的数据帧值,如下所示:
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的方法非常干净,接近你正在寻找的东西。