如何从更大的数据集中提取多个数据集

How to extract multiple datasets from a larger dataset

在 python 中,我正在尝试准备我的数据集。我想训练一个 LSTM,并将通过在按信用卡号分组并按时间排序的所有数据上训练模型来实现。

但是,对于我的测试集,我想创建一组序列,即每个客户信用卡号的交易序列。因此,我可以用这个来测试单个客户的模型,而不仅仅是随机交易。

为此,我首先从信用卡号列中提取所有信用卡号并将它们添加到列表中。

cc_list = df['cc_num'].tolist()

然后我删除了列表中的所有重复项,这样我就得到了一个包含所有可能的不同帐户的列表:

all_accounts = list(set(cc_list))

然后我尝试为列表中的每个帐号(大约 900 个)创建一个新的 Dataframe

for acc in all_accounts:
y = df.loc[df['cc_num'] == acc]\
    .sort_values(by=['trans_date_trans_time'],ascending=True)
print(y)

但是,这只为我提供了最后一个帐号的 Dataframe,而不是全部。

我也试过定义一个函数

accounts = df['cc_num'].unique()

def grouping_ccn(df):
    subset_values = []
    for acc in accounts:
        x = df.loc[df['cc_num'] == acc]\
            .sort_values(by=['trans_date_trans_time'],ascending=True)
        subset_values.append(x)
return np.array(subset_values)
groups_cc = grouping_ccn(df)

但这也没有用,它给出了一条错误消息:“ValueError:无法将大小为 2028 的序列复制到维度为 22 的数组轴”。 我知道为什么会出现此错误,但我只是不知道如何解决此问题。

我在这方面完全是菜鸟,所以任何帮助将不胜感激。

标准规则:如果您使用列表(或字典),那么您需要列表(或字典)来保留所有结果。


如果您希望每个帐户都保存在单独的数据框中,那么您应该将它们附加到列表中,然后使用 for-loop 分别处理每个数据框 (one-by-one)。

或者您可以将 account: data 添加到字典中,以后只为所选帐户获取数据框可能会更简单 - dict[account].

要获得唯一帐户,您可以使用 unique() 而不是 set()

但使用 groupby() 并稍后使用循环将每个组放入列表或目录中可能会更简单。

如果你想将包含所有数据帧的列表转换回一个字典,那么你可以使用 concat().


一些数据的最小工作示例

import pandas as pd

data = {
    'account': ['A','B','A','C','B'], 
    'time': ['2022.02.20','2022.02.20','2022.02.19','2022.02.20','2022.02.10'], 
}

main_df = pd.DataFrame(data)

print('\n--- main df ---\n')
print(main_df)

print('\n--- unique accounts ---\n')
print(main_df['account'].unique())

print('\n--- groups ---\n')

sorted_groups = main_df.sort_values(['time']).groupby('account')
all_dfs_list = []
all_dfs_dict = {}
for value, group in sorted_groups:
    print('-', value, '-')
    #print(group)
    print(group.reset_index(drop=True))
    all_dfs_list.append(group.reset_index(drop=True))
    all_dfs_dict[value] = group.reset_index(drop=True)

print('\n--- list ---\n')
for df in all_dfs_list:
    print(df)
    print('-')

print('\n--- dict ---\n')
for account, df in all_dfs_dict.items():
    print('-', account, '-')
    print(df)
    print('-')

print('\n--- concat groups ---\n')
print(pd.concat(all_dfs_list).reset_index(drop=True))

print('\n--- sort df ---\n')
print(main_df.sort_values(['account', 'time']).reset_index(drop=True))

结果:

--- main df ---

  account        time
0       A  2022.02.20
1       B  2022.02.20
2       A  2022.02.19
3       C  2022.02.20
4       B  2022.02.10

--- unique accounts ---

['A' 'B' 'C']

--- groups ---

- A -
  account        time
0       A  2022.02.19
1       A  2022.02.20
- B -
  account        time
0       B  2022.02.10
1       B  2022.02.20
- C -
  account        time
0       C  2022.02.20

--- list ---

  account        time
0       A  2022.02.19
1       A  2022.02.20
-
  account        time
0       B  2022.02.10
1       B  2022.02.20
-
  account        time
0       C  2022.02.20
-

--- dict ---

- A -
  account        time
0       A  2022.02.19
1       A  2022.02.20
-
- B -
  account        time
0       B  2022.02.10
1       B  2022.02.20
-
- C -
  account        time
0       C  2022.02.20
-

--- concat groups ---

  account        time
0       A  2022.02.19
1       A  2022.02.20
2       B  2022.02.10
3       B  2022.02.20
4       C  2022.02.20

--- sort df ---

  account        time
0       A  2022.02.19
1       A  2022.02.20
2       B  2022.02.10
3       B  2022.02.20
4       C  2022.02.20

文档: