gpt4 book ai didi

python - 从大型数据集中的成对列中选择最后一个有效数据日期

转载 作者:行者123 更新时间:2023-12-03 19:39:26 32 4
gpt4 key购买 nike

我有一个如下所示的数据框,其中第一列包含日期,其他列包含这些日期的数据:

         date  k1-v1  k1-v2  k2-v1  k2-v2  k1k3-v1  k1k3-v2  k4-v1  k4-v2
0 2021-01-05 2.0 7.0 NaN NaN NaN NaN 9.0 6.0
1 2021-01-31 NaN NaN 8.0 5.0 NaN NaN 7.0 6.0
2 2021-02-15 9.0 5.0 NaN 3.0 4.0 NaN NaN NaN
3 2021-02-28 NaN 9.0 0.0 1.0 NaN NaN 8.0 8.0
4 2021-03-20 7.0 NaN NaN NaN NaN NaN NaN NaN
5 2021-03-31 NaN NaN 8.0 NaN 3.0 NaN 8.0 0.0
6 2021-04-10 NaN NaN 7.0 6.0 NaN NaN NaN 9.0
7 2021-04-30 NaN 6.0 NaN NaN NaN NaN 1.0 NaN
8 2021-05-14 8.0 NaN 3.0 3.0 4.0 NaN NaN NaN
9 2021-05-31 NaN NaN 2.0 1.0 NaN NaN NaN NaN
列总是成对的: ( k1-v1 , k1-v2 ) ; ( k2-v1 , k2-v2 ) ; ( k1k3-v1 , k1k3-v2 )等等 电话 对。但成对列并不总是按这个顺序排列。所以 k1-v1 后面不一定是 k1-v2 只有,但会有 k1-v2 数据框中某处的列。为简单起见,我并排展示了它们。
我要找 最后有效数据 日期 在每一对列中,总结如下:
   keys     v1-last     v2-last
0 k1 2021-05-14 2021-04-30
1 k2 2021-05-31 2021-05-31
2 k1k3 2021-05-14 NaN
3 k4 2021-04-30 2021-04-10
所以对于 ( k1-v1 )最后一个有效数据是 8.0日期 2021-05-14 , 为 ( k2-v2 )它的 6.02021-04-30 .栏目 v1-last v2-last 然后在上面的数据框中相应地填充 k1 ,其他人也一样。
目前我正在这样做,这在较大的数据集上不是很有效:
df.set_index('date', inplace=True)
unique_cols = set([col[0] for col in df.columns.str.split('-')])
summarized_data = []
for col in unique_cols:
pair_df = df.loc[:,[col+'-v1',col+'-v2']].dropna(how='all')
v1_last_valid = pair_df.iloc[:,0].last_valid_index()
v2_last_valid = pair_df.iloc[:,1].last_valid_index()
summarized_data.append([col, v1_last_valid, v2_last_valid])

summarized_df = pd.DataFrame(summarized_data, columns=['keys','v1-last','v2-last'])
这现在有效,并给了我预期的结果,但在大型数据集上运行时需要大量时间。是否可以避免循环并以不同且有效的方式完成?

最佳答案

我们可以反转列的名称并使用 pd.wide_to_long stub 名称将在哪里 v_j s,标识符将为 date我们调用 k* s 为 keys结果中。然后我们可以通过 keys 分组并与 DataFrame.last_valid_index 聚合:

# reverse the column names
df.columns = df.columns.str.replace(r"(\w+)-(\w+)", r"\2-\1", regex=True)

# wide to long (and then make `keys` a column with reset_index)
long = pd.wide_to_long(df, stubnames=["v1", "v2"], i="date", j="keys",
sep="-", suffix=r"\w+").reset_index("keys")

# get the last valid dates & add a suffix
result = (long.groupby("keys")
.agg(pd.DataFrame.last_valid_index)
.add_suffix("-last"))

要得到
>>> result

v1-last v2-last
keys
k1 2021-05-14 2021-04-30
k1k3 2021-05-14 None
k2 2021-05-31 2021-05-31
k4 2021-04-30 2021-04-10


使 v_j 的 stub 名称更通用s:
stubnames = df.columns.str.extract(r"^(\w+)-", expand=False).dropna().unique()
# Index(["v1", "v2"], dtype="object")

关于python - 从大型数据集中的成对列中选择最后一个有效数据日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67848578/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com