我有以下数据集
trade_id start_date end_date factset_entity_id product_id product_name l6_id multi_assign_flag
0 100000191 2017 NaT 0711GY-E 99996362 Fan Milk - FanYogo 5.015152e+11 0.0
1 100000193 2017 2018 0711GY-E 99996413 Fan Milk - FanDango/Frozen FanDango 5.015151e+11 0.0
2 100000193 2018 2022 0711GY-E 99996413 Fan Milk - FanDango 5.015151e+11 0.0
3 100000193 2022 NaT 0711GY-E 99996413 Fan Milk - FanDango 5.015151e+11 0.0
4 100000231 2016 2018 05NC3S-E 59979529 Ci:z Holdings - Dr. Ci:Labo 5.020102e+11 1.0我的目标是复制start_date和end_date不同的行,例如
1 100000193 2017 2018 0711GY-E 99996413 Fan Milk - FanDango/Frozen FanDango 5.015151e+11 0.0应该是
2017 100000193 0711GY-E 99996413 Fan Milk - FanDango/Frozen FanDango 5.015151e+11 0.0
2018 100000193 0711GY-E 99996413 Fan Milk - FanDango/Frozen FanDango 5.015151e+11 0.0你知道我在这里不用循环能做什么吗?谢谢
我试着用简单的循环来做,这很好,但速度很慢。我想知道熊猫是否有捷径来缓解它。
发布于 2022-11-12 18:39:47
对于以下玩具数据,其中0行和2行有不同的开始日期和结束日期:
import pandas as pd
df = pd.DataFrame(
{
"trade_id": [100000191, 100000192, 100000193, 100000194, 100000231],
"start_date": [2017, 2017, 2018, 2022, 2018],
"end_date": [None, 2017, 2022, 2022, 2018],
"factset_entity_id": [
"0711GY-E",
"0711GY-E",
"0711GY-E",
"0711GY-E",
"05NC3S-E",
],
"product_id": [99996362, 99996413, 99996414, 99996415, 59979529],
}
)下面是使用pd.concat实现这一任务的一种方法
df = pd.concat([df, df.loc[df["start_date"] != df["end_date"], :]]).sort_index()然后,您可以看到第0行和第2行现在被复制:
print(df)
# Output
trade_id start_date end_date factset_entity_id product_id
0 100000191 2017 NaN 0711GY-E 99996362
0 100000191 2017 NaN 0711GY-E 99996362
1 100000192 2017 2017.0 0711GY-E 99996413
2 100000193 2018 2022.0 0711GY-E 99996414
2 100000193 2018 2022.0 0711GY-E 99996414
3 100000194 2022 2022.0 0711GY-E 99996415
4 100000231 2018 2018.0 05NC3S-E 59979529https://stackoverflow.com/questions/74365921
复制相似问题