为了账号安全,请及时绑定邮箱和手机立即绑定

将数据框转换为具有几个键(member_IDs)和加法值(科目余额)的字典

将数据框转换为具有几个键(member_IDs)和加法值(科目余额)的字典

慕哥6287543 2022-09-06 19:45:16
我有以下问题:我的目标是提取数据帧的唯一成员ID,并具有as键,并提取和汇总它们具有的事务并将其作为值。唯一mem_id = 例如 70850441974905670928446金额 = 150.78card_members = df['unique_mem_id'].unique()编辑:这是数据帧的摘录:transaction_date    unique_mem_id   description amount6/21/2014   7.08504E+22 HILLERS MARKET         NORTHVILLE   MI  61.726/22/2014   7.08504E+22 BUSCH'S #1032          PLYMOUTH     MI  25.486/23/2014   7.08504E+22 SPEEDWAY XXXXX 5 M     PLYMOUTH     MI  30.736/23/2014   7.08504E+22 HENDERSON GLASS INC    NOVI         MI  29.956/23/2014   7.08504E+22 HILLERS MARKET         NORTHVILLE   MI  59.66/23/2014   7.08504E+22 SPEEDWAY XXXXX 5 M     PLYMOUTH     MI  60.596/24/2014   7.08504E+22 BEACHWAY RESORT        SAUGATUCK    MI  1142.46/24/2014   7.08504E+22 PUMPERNICKELS EATERY   SAUGATUCK    MI  88.526/24/2014   7.08504E+22 DEMOND'S SUPER         DOUGLAS      MI  79.756/25/2014   7.08504E+22 DEMOND'S SUPER         DOUGLAS      MI  128.21编辑结束DatetimeIndex: 852 个条目, 2014-06-21 至 2020-01-23 数据列 (共 4 列): # 列 非空计数 Dtype--- ------ -------------- -----0 transaction_date 852 非空 datetime64[ns]1 unique_mem_id 852 非空对象2 描述 852 非空对象3 数量 852 非空 float64dtypes: datetime64ns, float64(1), object(2) 内存使用量: 53.3+ KB这是我尝试编码的字典:#test for transactionsfrom collections import defaultdicttransaction_dict = defaultdict(list)for row in df_card.items():    try:        key = card_members        value = df_card.amount    except ValueError:        continue    transaction_dict[key] += valueprint(transaction_dict)出现的错误是:不可哈希的类型:'numpy.ndarray'我也尝试过df_card.iterrows(),但这也失败了:(
查看完整描述

3 回答

?
慕勒3428872

TA贡献1848条经验 获得超5个赞

我认为你可以使用如下:df_card.iterrows


transaction_dict = {}

for i, row in df_card.iterrows():

  key = row['unique_mem_id']

  val = row['amount']

  transaction_dict[key] = transaction_dict.get(key,0) + val

希望它有帮助!


查看完整回答
反对 回复 2022-09-06
?
潇湘沐

TA贡献1816条经验 获得超6个赞

dic = {}

for i in range(len(df)):

    key = df.at[i, 'unique_mem_id']

    if df.at[i, 'unique_mem_id'] in dic:

        dic[key] += df.at[i, 'description amount']

    else:

        dic[key] = df.at[i, 'description amount']

试试这个!首先,我们创建一个字典。然后,我们遍历数据帧的每一行,并检查特定是否已经作为键存在于字典中。如果它是一个键,只需将 添加到该键,否则在字典中创建一个新键。unique_mem_iddescription_amount


查看完整回答
反对 回复 2022-09-06
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

为了完成此操作并对第三方有用,我的最终解决方案是:我使用了一个解决方法,这是以下步骤的副产品,但与Yosua发布的解决方案类似。


创建一个新列,将交易记录标记为“费用”或“收入”,然后运行 if 循环,直到它达到第一个“收入”并将其相加。

´


transaction_class_card = pd.Series([], dtype = 'object')

    for index, i in enumerate(df_card['transaction_category_name']):

        if i in card_inc:

            transaction_class_card[index] = "income"

        elif i in card_exp:

            transaction_class_card[index] = "expense"

        else:

            transaction_class_card[index] = "NOT_CLASSIFIED"

    df_card.insert(loc = len(df_card.columns), column = "transaction_class", value = transaction_class_card)

´


追加新列后,我使用 follow 将行作为元组进行迭代,并在点击“收入”后立即停止,然后将之前的所有“费用”相加。


数据帧切片


df_1 = df_card[['unique_mem_id', 'amount', 'transaction_class']][df_card['unique_mem_id'] == '70850441974905670928446']

使用元组进行迭代


cumulative_amount = []

amount_list = []

for row in df_1.itertuples():

   #access data using column names

   if row.transaction_class == "expense":

     #print(index, row.unique_mem_id, row.amount, row.transaction_class)

     amount_list.append(row.amount)

     cumulative_amount = np.cumsum(amount_list, axis = 0)

     #print(row.unique_mem_id, cumulative_amount)

   else:

  #print(f"stopped at user_ID: {row.unique_mem_id}, cumulative sum injected {cumulative_amount[-1]}")

                        break

                #print out the member id as part of the for-loop and and the last element of the list which is the amount to be injected

                print(f"unique_member_ID: {row.unique_mem_id}; initial injection needed in USD: {cumulative_amount[-1]}")

这将打印各自的member_ID及其费用的总和。希望这些变体有助于:)


查看完整回答
反对 回复 2022-09-06
  • 3 回答
  • 0 关注
  • 66 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信