Python 熊猫,基于重复计数的现有列创建新列
解释起来有点复杂,所以我会尽力的。我有一个有两列的熊猫:小时(从1到24)和值(对应于每个小时)。数据集索引非常庞大,但列hour在24小时的基础上重复(从1到24)。我正在尝试创建新的24列:value-1、value-2、value-3…value-24,它将对应于每一行和-1小时的值,以及-2小时的值(从上面的行) 所有数值均为示例。正如我所说的,有很多行,不仅仅是一天中所有小时的24行,还有从1到24的所有后续时间序列,等等。 提前感谢,愿原力与你同在 这就是你需要的吗Python 熊猫,基于重复计数的现有列创建新列,python,pandas,Python,Pandas,解释起来有点复杂,所以我会尽力的。我有一个有两列的熊猫:小时(从1到24)和值(对应于每个小时)。数据集索引非常庞大,但列hour在24小时的基础上重复(从1到24)。我正在尝试创建新的24列:value-1、value-2、value-3…value-24,它将对应于每一行和-1小时的值,以及-2小时的值(从上面的行) 所有数值均为示例。正如我所说的,有很多行,不仅仅是一天中所有小时的24行,还有从1到24的所有后续时间序列,等等。 提前感谢,愿原力与你同在 这就是你需要的吗 df = pd.
df = pd.DataFrame([[1,10],[2,11],
[3,12],[4,13]], columns=['hour','value'])
for i in range(1, 24):
df['value -' + str(i)] = df['value'].shift(i).fillna(0)
结果:
这就是你要找的吗
import pandas as pd
df = pd.DataFrame({'hour': list(range(24))*2,
'value': list(range(48))})
shift_cols_n = 10
for shift in range(1, shift_cols_n):
new_columns_name = 'value - ' + str(shift)
# Assuming that you don't have any NAs in your dataframe
df[new_columns_name] = df['value'].shift(shift).fillna(0)
# A safer (and a less simple) way, in case you have NAs in your dataframe
df[new_columns_name] = df['value'].shift(shift)
df.loc[:shift, new_columns_name] = 0
print(df.head(9))
hour value value - 1 value - 2 value - 3 value - 4 value - 5 \
0 0 0 0.0 0.0 0.0 0.0 0.0
1 1 1 0.0 0.0 0.0 0.0 0.0
2 2 2 1.0 0.0 0.0 0.0 0.0
3 3 3 2.0 1.0 0.0 0.0 0.0
4 4 4 3.0 2.0 1.0 0.0 0.0
5 5 5 4.0 3.0 2.0 1.0 0.0
6 6 6 5.0 4.0 3.0 2.0 1.0
7 7 7 6.0 5.0 4.0 3.0 2.0
8 8 8 7.0 6.0 5.0 4.0 3.0
value - 6 value - 7 value - 8 value - 9
0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0
3 0.0 0.0 0.0 0.0
4 0.0 0.0 0.0 0.0
5 0.0 0.0 0.0 0.0
6 0.0 0.0 0.0 0.0
7 1.0 0.0 0.0 0.0
8 2.0 1.0 0.0 0.0
请问你为什么要这样做?您引入了大量冗余数据,因此可能有更好的方法。最好不要将逻辑写入数据库,而是写入独立的函数。你可能应该重新考虑一下。那太好了——有没有办法避免这种循环?
import pandas as pd
df = pd.DataFrame({'hour': list(range(24))*2,
'value': list(range(48))})
shift_cols_n = 10
for shift in range(1, shift_cols_n):
new_columns_name = 'value - ' + str(shift)
# Assuming that you don't have any NAs in your dataframe
df[new_columns_name] = df['value'].shift(shift).fillna(0)
# A safer (and a less simple) way, in case you have NAs in your dataframe
df[new_columns_name] = df['value'].shift(shift)
df.loc[:shift, new_columns_name] = 0
print(df.head(9))
hour value value - 1 value - 2 value - 3 value - 4 value - 5 \
0 0 0 0.0 0.0 0.0 0.0 0.0
1 1 1 0.0 0.0 0.0 0.0 0.0
2 2 2 1.0 0.0 0.0 0.0 0.0
3 3 3 2.0 1.0 0.0 0.0 0.0
4 4 4 3.0 2.0 1.0 0.0 0.0
5 5 5 4.0 3.0 2.0 1.0 0.0
6 6 6 5.0 4.0 3.0 2.0 1.0
7 7 7 6.0 5.0 4.0 3.0 2.0
8 8 8 7.0 6.0 5.0 4.0 3.0
value - 6 value - 7 value - 8 value - 9
0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0
3 0.0 0.0 0.0 0.0
4 0.0 0.0 0.0 0.0
5 0.0 0.0 0.0 0.0
6 0.0 0.0 0.0 0.0
7 1.0 0.0 0.0 0.0
8 2.0 1.0 0.0 0.0