0

在 python pandas DataFrame 中,我想在一行中更新索引的值(最好就地更新,因为 DataFrame 很大)。

索引是 DatetimeIndex,DataFrame 可能包含几列。

例如:

In [1]: import pandas as pd
In [2]: pd.DataFrame({'DATA': [1,2,3]},
                      index=[pd.Timestamp(2011,10,01,00,00,00),
                             pd.Timestamp(2011,10,01,02,00,00),
                             pd.Timestamp(2011,10,01,03,00,00)])
Out[5]: 
                     DATA
2011-10-01 00:00:00     1
2011-10-01 02:00:00     2
2011-10-01 03:00:00     3

所需的输出是:

                     DATA
2011-10-01 01:00:00     1   <---- Index changed !!!
2011-10-01 02:00:00     2
2011-10-01 03:00:00     3

对于大型 DataFrame 是否有一种简单(且便宜)的方法?

假设样本的位置是已知的(例如它是需要更改的第 n 行)!

4

2 回答 2

2

一种可能的解决方案Series.replace,但首先需要转换Index.to_series

df.index = df.index
             .to_series()
             .replace({pd.Timestamp('2011-10-01'): pd.Timestamp('2011-10-01 01:00:00')})
print (df)
                     DATA
2011-10-01 01:00:00     1
2011-10-01 02:00:00     2
2011-10-01 03:00:00     3

Index.where(新)的另一个解决方案0.19.0

df.index = df.index.where(df.index != pd.Timestamp('2011-10-01'),
                          [pd.Timestamp('2011-10-01 01:00:00')])

print (df)
                     DATA
2011-10-01 01:00:00     1
2011-10-01 02:00:00     2
2011-10-01 03:00:00     3

附加新行并删除旧行的解决方案drop,最后sort_index

df.loc[pd.Timestamp('2011-10-01 01:00:00')] = df.loc['2011-10-01 00:00:00', 'DATA']
df.drop(pd.Timestamp('2011-10-01 00:00:00'), inplace=True)
df.sort_index(inplace=True)
print (df)
                     DATA
2011-10-01 01:00:00     1
2011-10-01 02:00:00     2
2011-10-01 03:00:00     3

如果需要按值而不是按位置替换的另一种解决方案:

df.index.set_value(df.index, pd.Timestamp(2011,10,1,0,0,0), pd.Timestamp(2011,10,1,1,0,0))
print (df)
                     DATA
2011-10-01 01:00:00     1
2011-10-01 02:00:00     2
2011-10-01 03:00:00     3

index转换为numpy arrayfrom comment的最后一个解决方案:

i = 0
df.index.values[i] = pd.Timestamp('2011-10-01 01:00:00')
print (df)          
                     DATA
2011-10-01 01:00:00     1
2011-10-01 02:00:00     2
2011-10-01 03:00:00     3
于 2016-10-31T11:17:21.857 回答
2

如果您已经知道要操作的索引,那么快速方法将是直接查找,然后您可以在以下帮助下相应地设置它的值Index.set_value

df.index.set_value(df.index, df.index[0], pd.Timestamp(2011,10,1,1,0,0))
#                  <-index-> <-row num->  <---value to be inserted--->

这是一个就地操作,因此您无需将结果分配回自身。

于 2016-10-31T11:46:03.600 回答