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

我有以下问题:我的目标是提取数据帧的唯一成员ID,并具有as键,并提取和汇总它们具有的事务并将其作为值。


唯一mem_id = 例如 70850441974905670928446


金额 = 150.78


card_members = df['unique_mem_id'].unique()


编辑:这是数据帧的摘录:


transaction_date    unique_mem_id   description amount

6/21/2014   7.08504E+22 HILLERS MARKET         NORTHVILLE   MI  61.72

6/22/2014   7.08504E+22 BUSCH'S #1032          PLYMOUTH     MI  25.48

6/23/2014   7.08504E+22 SPEEDWAY XXXXX 5 M     PLYMOUTH     MI  30.73

6/23/2014   7.08504E+22 HENDERSON GLASS INC    NOVI         MI  29.95

6/23/2014   7.08504E+22 HILLERS MARKET         NORTHVILLE   MI  59.6

6/23/2014   7.08504E+22 SPEEDWAY XXXXX 5 M     PLYMOUTH     MI  60.59

6/24/2014   7.08504E+22 BEACHWAY RESORT        SAUGATUCK    MI  1142.4

6/24/2014   7.08504E+22 PUMPERNICKELS EATERY   SAUGATUCK    MI  88.52

6/24/2014   7.08504E+22 DEMOND'S SUPER         DOUGLAS      MI  79.75

6/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 非空 float64

dtypes: datetime64ns, float64(1), object(2) 内存使用量: 53.3+ KB


这是我尝试编码的字典:


#test for transactions

from collections import defaultdict

transaction_dict = defaultdict(list)


for row in df_card.items():

    try:

        key = card_members

        value = df_card.amount

    except ValueError:

        continue


    transaction_dict[key] += value


print(transaction_dict)

出现的错误是:不可哈希的类型:'numpy.ndarray'


我也尝试过df_card.iterrows(),但这也失败了:(


慕哥6287543
浏览 67回答 3
3回答

慕勒3428872

我认为你可以使用如下:df_card.iterrowstransaction_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希望它有帮助!

潇湘沐

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

哆啦的时光机

为了完成此操作并对第三方有用,我的最终解决方案是:我使用了一个解决方法,这是以下步骤的副产品,但与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及其费用的总和。希望这些变体有助于:)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python