我们如何组合数据框字典中的列值?
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 值为 16
或 20
.
的数据帧
我们是否也可以创建此类数据帧的可能组合?
示例:
假设数据框字典有四个数据框:
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
。
假设我们有一个包含 900 个数据帧的数据帧字典。
每个数据框都有唯一的行数但相同的列数(假设为 9)和相同的列名。假设数据帧字典中所有数据帧共有的名为“C1”的列具有从 1 到 4000 不等的整数值。
我们如何通过从数据帧字典中的每个数据帧中选择与 C1 中的任何唯一值对应的行来创建数据帧?生成的数据框将有 900 行和与原始数据框相同的列数(即 9)。
我们不希望从字典中的每个数据框中选择的 C1 值相同。我们想要不同的值组合。
并非所有数据帧都具有相同的 C1 值集。有些人可能有 {11, 16, 20}
,其他人可能有 {10, 16, 20}
。我们只想从所有数据框中存在的值创建数据框。因此,在此示例中,我们只需要 C1 值为 16
或 20
.
我们是否也可以创建此类数据帧的可能组合?
示例:
假设数据框字典有四个数据框:
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
。