熊猫系列重复n次并更改列值

时间:2020-07-25 06:51:58

标签: python pandas

我有这样的输入数据。

NAME | PLACE | DATE
  A  |   X   | 2020-04-30
  B  |   Y   | 2019-04-30

我想重复5次并通过增加年份来更改日期

NAME | PLACE | DATE
  A  |   X   | 2020-04-30
  A  |   X   | 2021-04-30
  A  |   X   | 2022-04-30
  A  |   X   | 2023-04-30
  A  |   X   | 2024-04-30
  A  |   X   | 2025-04-30
  B  |   Y   | 2019-04-30
  B  |   Y   | 2020-04-30
  B  |   Y   | 2021-04-30
  B  |   Y   | 2022-04-30
  B  |   Y   | 2023-04-30
  B  |   Y   | 2024-04-30

使用大熊猫重复有可能吗?

4 个答案:

答案 0 :(得分:4)

使用:

df['Date'] = pd.to_datetime(df['Date'])

y = np.array([pd.offsets.DateOffset(years=_) for _ in np.tile(range(6), len(df.index))])
df = df.reindex(df.index.repeat(6)).assign(Date=lambda x: x['Date'] + y)

详细信息:

创建一个np.arrayDateOffset对象,需要将其添加到Date列中以获得所需的年份偏移量。

print(y)
array([<DateOffset: years=0>, <DateOffset: years=1>,
       <DateOffset: years=2>, <DateOffset: years=3>,
       <DateOffset: years=4>, <DateOffset: years=5>,
       <DateOffset: years=0>, <DateOffset: years=1>,
       <DateOffset: years=2>, <DateOffset: years=3>,
       <DateOffset: years=4>, <DateOffset: years=5>], dtype=object)

使用reindex根据需要为数据框重新编制索引,并使用Assign将Date与年份相加。

print(df)
  Name Place       Date
0    A     X 2020-04-30
0    A     X 2021-04-30
0    A     X 2022-04-30
0    A     X 2023-04-30
0    A     X 2024-04-30
0    A     X 2025-04-30
1    B     Y 2019-04-30
1    B     Y 2020-04-30
1    B     Y 2021-04-30
1    B     Y 2022-04-30
1    B     Y 2023-04-30
1    B     Y 2024-04-30

答案 1 :(得分:3)

让我们尝试一下,将单个日期转换为给定范围内的dates数组,并利用DataFrame.explode将类似列表的每个元素转换为一行。

import pandas as pd

df = pd.DataFrame({
    "Name": ["A", "B"],
    "Place": ["X", "Y"],
    "Date": ["2020-04-30", "2020-04-30"]
})

expand = 5
print(
    df.assign(
        Date=pd.to_datetime(df.Date)
            .apply(lambda x: [x.replace(x.year + i) for i in range(0, expand + 1)])
    ).explode("Date").reset_index(drop=True)
)

   Name Place       Date
0     A     X 2020-04-30
1     A     X 2021-04-30
2     A     X 2022-04-30
3     A     X 2023-04-30
4     A     X 2024-04-30
5     A     X 2025-04-30
6     B     Y 2020-04-30
7     B     Y 2021-04-30
8     B     Y 2022-04-30
9     B     Y 2023-04-30
10    B     Y 2024-04-30
11    B     Y 2025-04-30

答案 2 :(得分:2)

这是一种实现方法:

df_out = df.reindex(df.index.repeat(6))

df_out['DATE'] += pd.Series([pd.DateOffset(years=i) 
                              for i in df_out.groupby('AME').cumcount()], 
                            index=df_out.index)    
df_out.reset_index(drop=True)

输出:

      AME    PLACE       DATE
0     A       X    2020-04-30
1     A       X    2021-04-30
2     A       X    2022-04-30
3     A       X    2023-04-30
4     A       X    2024-04-30
5     A       X    2025-04-30
6     B       Y    2019-04-30
7     B       Y    2020-04-30
8     B       Y    2021-04-30
9     B       Y    2022-04-30
10    B       Y    2023-04-30
11    B       Y    2024-04-30

答案 3 :(得分:1)

我认为无法以您想要的方式重复。 但也许这种方法可以帮助您:

first_clm = (["A"] * 6)
first_clm.extend(["B"] * 6)
scnd_clm = (["X"] * 6)
scnd_clm.extend(["Y"] * 6)
third_clm = ["20%s-04-30" % i for i in range(20,26)]
third_clm.extend(["20%s-04-30" % i for i in range(19,25)])
pd.DataFrame({"NAME": first_clm, "PLACE": scnd_clm, "DATE":third_clm})