我有这样的输入数据。
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
使用大熊猫重复有可能吗?
答案 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.array
个DateOffset
对象,需要将其添加到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})