pandas 如何用常规 Dataframe 中的值替换multiIndex Dataframe 中的级别2?

kpbpu008  于 2023-06-04  发布在  其他
关注(0)|答案(1)|浏览(174)

我正在编写一个算法,用于处理工作中的客户进行一些数据分析,我按用户ID对数据进行分组,作为我的级别1,然后按月份对我的级别2进行分组。
然后,我正在逐个用户地对数据进行一些处理工作,其中涉及每月的时间序列。
我下面的代码做的正是我需要它做的,保存到最后一步。

    • 如何在输出中使用经过处理的时间序列数据重载原始数据?**
tempDF1 = pd.read_csv('data.csv', index_col=[0,1], parse_dates=[1], thousands=',')
    
    tempDF1["Average"] = 0
    tempDF1["Score"] = 0
    
    for id, df in tempDF1.groupby(level=0):
        for date in df.loc[id].index:
            df.loc[(id,date),"Average"] = df.loc[(id,date)].Purchased/df.loc[(id,date)].Count
            df.loc[(id,date),"Score"] = df.loc[(id,date)].Count/10*log(df.loc[(id,date)].Average, 10)
        try:
            list(df.loc[(id,"2021-01-01",),:])
        except:
            df.loc[(id, "2021-01-01",),:] = 0
        try:
            list(df.loc[(id,"2023-06-01",),:])
        except:
            df.loc[(id, "2023-06-01",),:] = 0

        resampleDF = df.loc[id].resample('M', closed="left").mean().fillna(0)
        print(resampleDF)
        tempDF1.loc[id].replace(resampleDF, inplace=True)
        print(tempDF1)

下面是上面代码的示例输出。* * resampleDF是针对ID 1785的,我正在尝试替换整个级别;二级索引,列中的数据,所有内容都是批发的。我需要将resampleDF放入tempDF1**中,以代替1785(以及其余部分,但这应该通过上面的循环来完成。

    • 重采样DF**

| 月|计数|购买|平均值|得分|
| - -----|- -----|- -----|- -----|- -----|
| 2021 - 01 - 31 - 2021 - 2021 - 01 - 31| 0.0| 0.0| 0.0| 0.000000|
| 2021 - 02 - 28 2021 - 02 - 28 2021 - 02 - 28| 0.0| 0.0| 0.0| 0.000000|
| 2021 - 03 - 31 - 2021 - 2021 - 2021 - 2021 - 2022 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023| 0.0| 0.0| 0.0| 0.000000|
| 2021 - 04 - 30 - 2021 - 04 - 30| 0.0| 0.0| 0.0| 0.000000|
| 2021 - 05 - 31 - 2021 - 2021 - 05 - 31| 0.0| 0.0| 0.0| 0.000000|
| 2021 - 06 - 30| 1.0|九九九九|九九九九|0.399996|
| 2021 - 07 - 31 - 2021 - 07 - 31 - 2021 - 07 - 21| 0.0| 0.0| 0.0| 0.000000|
| 2021 - 08 - 31 - 2021 - 2021 - 08 - 31 - 2021 - 2021 - 2021 - 2021 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 2022 - 202| 0.0| 0.0| 0.0| 0.000000|
| 2021 - 09 - 30 - 01 - 01| 0.0| 0.0| 0.0| 0.000000|
| 2021 - 10 - 31 - 2021 - 10 - 31 - 2021 - 10 - 31 - 2021 - 10 - 21| 2.0|二十点|十点|0.20万|
| 2021 - 11 - 30 - 2021 - 11 - 30 - 2021 - 11 - 30 - 2021 - 11 - 30 - 2021 - 11 - 21 - 21 - 21 - 21| 0.0| 0.0| 0.0| 0.000000|

    • tempDF1**

| 用户id|月|计数|购买|平均值|得分|
| - -----|- -----|- -----|- -----|- -----|- -----|
| 一七八五|2021 - 06 - 01 2021 - 06 - 01 2021 - 06 - 01| 1|九九九九|0| 0|
| | 2021 - 10 - 01 - 01| 2|二十个|0| 0|
| 一八五七年|2021 - 06 - 01 2021 - 06 - 01 2021 - 06 - 01| 1|一百|0| 0|
| 一九五三年|2021 - 03 - 01 2021 - 03 - 01| 5个|二百五十|0| 0|
| 2023年|2021 - 09 - 01 2021 - 09 - 01| 5个|一千一百|0| 0|
| ......这是什么?||......这是什么?|......这是什么?|......这是什么?|......这是什么?|
| 18149| 2023 - 03 - 01| 1|三百|0| 0|
| 18169年|2023 - 03 - 01| 2|四十|0| 0|
| 18177年|2023 - 03 - 01| 2|一千一百|0| 0|
| 一八二一零|2023 - 03 - 01| 1|十个|0| 0|
| 18215| 2023 - 03 - 01| 2|一百一十|0| 0|

gfttwv5a

gfttwv5a1#

使用您提供的 Dataframe :

import pandas as pd

tempDF1 = pd.DataFrame(
    {
        "user_id": [1785, 1785, 1857],
        "Month": ["2021-06-01", "2021-10-01", "2021-06-01"],
        "Count": [1, 2, 1],
        "Purchased": [9999, 20, 100],
        "Average": [0, 0, 0],
        "Score": [0, 0, 0],
    },
).set_index(["user_id", "Month"])

print(tempDF1)
# Output

                    Count  Purchased  Average  Score
user_id Month
1785    2021-06-01      1       9999        0      0
        2021-10-01      2         20        0      0
1857    2021-06-01      1        100        0      0
resampleDF = pd.DataFrame(
    {
        "Month": [
            "2021-01-31",
            "2021-02-28",
            "2021-03-31",
            "2021-04-30",
            "2021-05-31",
            "2021-06-30",
            "2021-07-31",
            "2021-08-31",
            "2021-09-30",
            "2021-10-31",
            "2021-11-30",
        ],
        "Count": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 2.0, 0.0],
        "Purchased": [0.0, 0.0, 0.0, 0.0, 0.0, 9999.0, 0.0, 0.0, 0.0, 20.0, 0.0],
        "Average": [0.0, 0.0, 0.0, 0.0, 0.0, 9999.0, 0.0, 0.0, 0.0, 10.0, 0.0],
        "Score": [0.0, 0.0, 0.0, 0.0, 0.0, 0.399996, 0.0, 0.0, 0.0, 0.2, 0.0],
    }
)

以下是使用Pandas dropassignconcat的一种方法:

tempDF1 = pd.concat(
    [
        resampleDF.assign(user_id=1785).set_index(["user_id", "Month"]),
        tempDF1.drop(index=1785),
    ]
)

print(tempDF1)
# Output

                    Count  Purchased  Average     Score
user_id Month
1785    2021-01-31    0.0        0.0      0.0  0.000000
        2021-02-28    0.0        0.0      0.0  0.000000
        2021-03-31    0.0        0.0      0.0  0.000000
        2021-04-30    0.0        0.0      0.0  0.000000
        2021-05-31    0.0        0.0      0.0  0.000000
        2021-06-30    1.0     9999.0   9999.0  0.399996
        2021-07-31    0.0        0.0      0.0  0.000000
        2021-08-31    0.0        0.0      0.0  0.000000
        2021-09-30    0.0        0.0      0.0  0.000000
        2021-10-31    2.0       20.0     10.0  0.200000
        2021-11-30    0.0        0.0      0.0  0.000000
1857    2021-06-01    1.0      100.0      0.0  0.000000

相关问题