pandas 的日期时间列乘以一个数字[重复]

问题描述 投票:0回答:2

我有一个带有字符串类型的日期时间列的数据框,如下所示:

>>> df2
       date     a    b
0  2020/1/1   8.0  5.0
1  2020/1/2  10.0  7.0
2  2020/1/3   6.0  1.0
3  2020/1/4   6.0  3.0

我想使用它的“日期”列通过乘以一个数组来生成一个具有不同长度的新索引,如下所示:

>>> idx_list = [2,3,1,2]
>>> df2.date*idx_list

但我得到了意想不到的结果:

>>> df2.date*idx_list
0            2020/1/12020/1/1
1    2020/1/22020/1/22020/1/2
2                    2020/1/3
3            2020/1/42020/1/4

有没有办法使新的索引系列成为顺序数据,例如:

0 2020/1/1
1 2020/1/1
2 2020/1/2
3 2020/1/2
4 2020/1/2
5 2020/1/3
6 2020/1/4
7 2020/1/4

谢谢!

python pandas datetime
2个回答
2
投票

要复制列值,您可以使用

repeat
。确保
idx_list
的长度与色谱柱的长度匹配。

df2 = pd.DataFrame({'date': ['2020/1/1', '2020/1/2', '2020/1/3', '2020/1/4'],
                    'a':    [8.0, 10.0, 6.0, 6.0],
                    'b':    [5.0, 7.0, 1.0, 3.0]})
idx_list = [2,3,1,2]
# use repeat
df2['date'].repeat(idx_list)


0    2020/1/1
0    2020/1/1
1    2020/1/2
1    2020/1/2
1    2020/1/2
2    2020/1/3
3    2020/1/4
3    2020/1/4
Name: date, dtype: object

如果您想复制整个数据帧的行,则将

date
设置为索引,尝试使用
Index.repeat
复制索引并使用
loc
复制行。

# make date the index
df2 = df2.set_index('date')
idx_list = [2,3,1,2]
# use repeat and loc to create duplicated rows
df2 = df2.loc[df2.index.repeat(idx_list)]
print(df2)


             a    b
date               
2020/1/1   8.0  5.0
2020/1/1   8.0  5.0
2020/1/2  10.0  7.0
2020/1/2  10.0  7.0
2020/1/2  10.0  7.0
2020/1/3   6.0  1.0
2020/1/4   6.0  3.0
2020/1/4   6.0  3.0

之后调用

reset_index()
会使
date
再次回到列中。


0
投票

你可以尝试重复列表n次然后爆炸

idx_list = [2,3,1,2]

df = (df.assign(date=df['date'].apply(lambda x: [x]) * idx_list)
      .explode('date'))
print(df)

       date     a    b
0  2020/1/1   8.0  5.0
0  2020/1/1   8.0  5.0
1  2020/1/2  10.0  7.0
1  2020/1/2  10.0  7.0
1  2020/1/2  10.0  7.0
2  2020/1/3   6.0  1.0
3  2020/1/4   6.0  3.0
3  2020/1/4   6.0  3.0
© www.soinside.com 2019 - 2024. All rights reserved.