我们如何组合数据框字典中的列值?

How do we make combinations of column values present in a dictionary of dataframes?

假设我们有一个包含 900 个数据帧的数据帧字典。

每个数据框都有唯一的行数但相同的列数(假设为 9)和相同的列名。假设数据帧字典中所有数据帧共有的名为“C1”的列具有从 1 到 4000 不等的整数值。

我们如何通过从数据帧字典中的每个数据帧中选择与 C1 中的任何唯一值对应的行来创建数据帧?生成的数据框将有 900 行和与原始数据框相同的列数(即 9)。

我们不希望从字典中的每个数据框中选择的 C1 值相同。我们想要不同的值组合。

并非所有数据帧都具有相同的 C1 值集。有些人可能有 {11, 16, 20},其他人可能有 {10, 16, 20}。我们只想从所有数据框中存在的值创建数据框。因此,在此示例中,我们只需要 C1 值为 1620.

的数据帧

我们是否也可以创建此类数据帧的可能组合?

示例:

假设数据框字典有四个数据框:

df1
C0  C1
a   1
a   2
a   3

df2
C0  C1
b   1
b   2
b   3

df3
C0  C1
c   1
c   2
c   3

df4
C0  C1
d   1

下图中给出了几个可能的数据帧示例:

尝试:

# Setup
cols = [f"C{i}" for i in range(10)]
dfs = {i: pd.DataFrame(np.random.randint(1, 4000, (1500, 10)), columns=cols)
           for i in range(900)}

excluded = []
data = []
for df in dfs.values():
    row = df.loc[~df['C0'].isin(excluded)].sample(n=1)
    excluded.append(row['C0'].squeeze())
    data.append(row)
df = pd.concat(data).reset_index(drop=True)

输出:

>>> df.head()
     C0    C1    C2    C3    C4    C5    C6    C7    C8    C9
0   430  1022  2094   345  1958   256  2142  3931  1030   800
1  3082   606  2657  2038   950   663  3037  1768  2471  2017
2  3075  2543  3046   790   588  1476  2562  2249  1457  1549
3  1636  3273  1585  1099   547   630  1958  3396  2110   117
4  3798  3933  2649  2234  3685  3509  3051  1970  1543  3685

>>> df['C0'].nunique()
900

>>> df.shape
(900, 10)

>>> df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 900 entries, 1 to 1499
Data columns (total 10 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   C0      900 non-null    int64
 1   C1      900 non-null    int64
 2   C2      900 non-null    int64
 3   C3      900 non-null    int64
 4   C4      900 non-null    int64
 5   C5      900 non-null    int64
 6   C6      900 non-null    int64
 7   C7      900 non-null    int64
 8   C8      900 non-null    int64
 9   C9      900 non-null    int64
dtypes: int64(10)
memory usage: 77.3 KB

勘误表:我使用 C0 作为名称而不是 C1