根据两列中值的组合制作小型 pandas 数据框
Make small pandas dataframes based on combinations of values in two columns
假设我下面有一个数据框。
A B
a 1
a 2
a 3
b 1
b 2
b 3
c 1
c 2
c 3
d 1
我想创建包含两列的数据框:A:A 列和 B 列中的唯一值:B 列中 A 中给定唯一值的可能值。请注意,所有这些数据框都必须是唯一的。下图给出了一些可能的数据帧示例:
主要思想是按 A 列对值进行分组,在列表中收集 B 中的值,创建所有这些列表的笛卡尔积,然后格式化回数据框
首先我们按A列加载数据和groupby
,将B
中的所有值收集到列表中:
from io import StringIO
import pandas as pd
data = StringIO('''
A B
a 1
a 2
a 3
b 1
b 2
b 3
c 1
c 2
c 3
d 1
''')
df = pd.read_csv(data, sep = '\s+')
df2 = df.groupby('A').agg(list)
df2
df2
看起来像这样:
B
A
a [1, 2, 3]
b [1, 2, 3]
c [1, 2, 3]
d [1]
接下来我们将B列中的所有列表提取到列表列表中:
all_lists = df2['B'].to_list()
all_lists
看起来像这样:
[[1, 2, 3], [1, 2, 3], [1, 2, 3], [1]]
现在是主要步骤,使用 MultiIndex.from_product
功能创建列表产品
mi = pd.MultiIndex.from_product(all_lists)
mi
mi
看起来像这样:
MultiIndex([(1, 1, 1, 1),
(1, 1, 2, 1),
(1, 1, 3, 1),
(1, 2, 1, 1),
(1, 2, 2, 1),
(1, 2, 3, 1),
(1, 3, 1, 1),
(1, 3, 2, 1),
(1, 3, 3, 1),
(2, 1, 1, 1),
(2, 1, 2, 1),
(2, 1, 3, 1),
(2, 2, 1, 1),
(2, 2, 2, 1),
(2, 2, 3, 1),
(2, 3, 1, 1),
(2, 3, 2, 1),
(2, 3, 3, 1),
(3, 1, 1, 1),
(3, 1, 2, 1),
(3, 1, 3, 1),
(3, 2, 1, 1),
(3, 2, 2, 1),
(3, 2, 3, 1),
(3, 3, 1, 1),
(3, 3, 2, 1),
(3, 3, 3, 1)],
)
我们快完成了——现在转换成 df 并确保我们有正确的标签。同时删除重复项(none 在这种情况下,但通常是个好主意)
(pd.DataFrame(index = mi)
.reset_index()
.drop_duplicates()
.set_axis(df2.index, axis=1)
.T
)
我们得到一个数据框:
0 1 2 3 4 5 6 7 8 9 ... 17 18 19 20 21 22 23 24 25 26
A
a 1 1 1 1 1 1 1 1 1 2 ... 2 3 3 3 3 3 3 3 3 3
b 1 1 1 2 2 2 3 3 3 1 ... 3 1 1 1 2 2 2 3 3 3
c 1 2 3 1 2 3 1 2 3 1 ... 3 1 2 3 1 2 3 1 2 3
d 1 1 1 1 1 1 1 1 1 1 ... 1 1 1 1 1 1 1 1 1 1
其中索引是旧列 A,每列都是旧列 B 中相关值的唯一组合
如果需要,您可以将其拆分为单独的数据帧,如果您愿意,可以循环遍历列
假设我下面有一个数据框。
A B
a 1
a 2
a 3
b 1
b 2
b 3
c 1
c 2
c 3
d 1
我想创建包含两列的数据框:A:A 列和 B 列中的唯一值:B 列中 A 中给定唯一值的可能值。请注意,所有这些数据框都必须是唯一的。下图给出了一些可能的数据帧示例:
主要思想是按 A 列对值进行分组,在列表中收集 B 中的值,创建所有这些列表的笛卡尔积,然后格式化回数据框
首先我们按A列加载数据和groupby
,将B
中的所有值收集到列表中:
from io import StringIO
import pandas as pd
data = StringIO('''
A B
a 1
a 2
a 3
b 1
b 2
b 3
c 1
c 2
c 3
d 1
''')
df = pd.read_csv(data, sep = '\s+')
df2 = df.groupby('A').agg(list)
df2
df2
看起来像这样:
B
A
a [1, 2, 3]
b [1, 2, 3]
c [1, 2, 3]
d [1]
接下来我们将B列中的所有列表提取到列表列表中:
all_lists = df2['B'].to_list()
all_lists
看起来像这样:
[[1, 2, 3], [1, 2, 3], [1, 2, 3], [1]]
现在是主要步骤,使用 MultiIndex.from_product
功能创建列表产品
mi = pd.MultiIndex.from_product(all_lists)
mi
mi
看起来像这样:
MultiIndex([(1, 1, 1, 1),
(1, 1, 2, 1),
(1, 1, 3, 1),
(1, 2, 1, 1),
(1, 2, 2, 1),
(1, 2, 3, 1),
(1, 3, 1, 1),
(1, 3, 2, 1),
(1, 3, 3, 1),
(2, 1, 1, 1),
(2, 1, 2, 1),
(2, 1, 3, 1),
(2, 2, 1, 1),
(2, 2, 2, 1),
(2, 2, 3, 1),
(2, 3, 1, 1),
(2, 3, 2, 1),
(2, 3, 3, 1),
(3, 1, 1, 1),
(3, 1, 2, 1),
(3, 1, 3, 1),
(3, 2, 1, 1),
(3, 2, 2, 1),
(3, 2, 3, 1),
(3, 3, 1, 1),
(3, 3, 2, 1),
(3, 3, 3, 1)],
)
我们快完成了——现在转换成 df 并确保我们有正确的标签。同时删除重复项(none 在这种情况下,但通常是个好主意)
(pd.DataFrame(index = mi)
.reset_index()
.drop_duplicates()
.set_axis(df2.index, axis=1)
.T
)
我们得到一个数据框:
0 1 2 3 4 5 6 7 8 9 ... 17 18 19 20 21 22 23 24 25 26
A
a 1 1 1 1 1 1 1 1 1 2 ... 2 3 3 3 3 3 3 3 3 3
b 1 1 1 2 2 2 3 3 3 1 ... 3 1 1 1 2 2 2 3 3 3
c 1 2 3 1 2 3 1 2 3 1 ... 3 1 2 3 1 2 3 1 2 3
d 1 1 1 1 1 1 1 1 1 1 ... 1 1 1 1 1 1 1 1 1 1
其中索引是旧列 A,每列都是旧列 B 中相关值的唯一组合
如果需要,您可以将其拆分为单独的数据帧,如果您愿意,可以循环遍历列