数据框中一行的所有组合
All combinations of a row in a dataframe
我有以下 Dataframe (df = ),大约有 40 行。
No Color
A Red
A Black
B White
B Orange
B Green
C Red
C Green
D Yellow
D Orange
D Green
我尝试得到以下输出:
No Color
A Red
A Black
B White
B Orange
B White
B Green
B Orange
B Green
C Red
C Green
D Yellow
D Orange
D Yellow
D Green
D Orange
D Green
起初我想使用 itertools 组合,it.combinations(Colors["Colors"],2),但问题是,它给了我整个列的组合并且不相关到“否”栏。
下一次尝试是聚合整个数据框以在列表中包含所有需要的组合并且只有大约 5000 行
来自:
No Colors
A Red, Black
B White, Orange, Green
C Red, Green, Yellow
D Orange, Green
至:
No Colors CombColors
A Red,Black Red, Black
B White,Orange,Green White, Orange, White, Green, Orange, Green
C Red,Green,Yellow Red, Green, Red, Yellow, Green, Yellow
D Orange,Green Orange, Green
with: df.apply(lambda x: list(it.combinations(x,2), axis =1)
但这也不起作用(每行中的所有组合)。
实现所需输出(尝试 1 或尝试 2)的正确解决方案是什么?
编辑:1
如果我尝试使用 df.apply(lambda x: list(it.combinations(x,2), axis =1)
我会生成以下列
No Colors CombColors
A Red,Black [([Red, Black], [(['Red', 'Black'], ['White'..
B White,Orange,Green [([White, Orange, Green], [(['Red', 'Black']...
C Red,Green,Yellow [([Red, Green], [(['Red', 'Black'], ['White'...
D Orange,Green [([Yellow, Orange, Green], [(['Red', 'Black']...
我认为问题是,我通过元组或列表聚合颜色(元组为空 [])。 df.groupby("No")["Color"].apply(list).agg(tuple).to_frame()
然而,itertool 为我提供了每一列的组合。
编辑 2:
alparslan mimaroğlu 和 Henry Vik 的解决方案都有效,并且(对我而言)令人惊讶。直到现在我还无法理解这些背后的逻辑,但我会尝试!谢谢!
您可以按否分组并轻松创建您想要的列表。
def combinations(group):
return pd.Series(list(it.combinations(group['Color'].unique(), 2)))
df.groupby('No').apply(combinations).explode()
如果你不让它爆炸,它会return你一个颜色组合列表
IIUC 你可以使用 groupby
和 agg
:
print (df.groupby("No").agg(Colors=("Color", ", ".join),
CombColors=("Color", lambda d: ", ".join(chain.from_iterable(combinations(d, 2))))))
Colors CombColors
No
A Red, Black Red, Black
B White, Orange, Green White, Orange, White, Green, Orange, Green
C Red, Green Red, Green
D Yellow, Orange, Green Yellow, Orange, Yellow, Green, Orange, Green
我有以下 Dataframe (df = ),大约有 40 行。
No Color
A Red
A Black
B White
B Orange
B Green
C Red
C Green
D Yellow
D Orange
D Green
我尝试得到以下输出:
No Color
A Red
A Black
B White
B Orange
B White
B Green
B Orange
B Green
C Red
C Green
D Yellow
D Orange
D Yellow
D Green
D Orange
D Green
起初我想使用 itertools 组合,it.combinations(Colors["Colors"],2),但问题是,它给了我整个列的组合并且不相关到“否”栏。 下一次尝试是聚合整个数据框以在列表中包含所有需要的组合并且只有大约 5000 行
来自:
No Colors
A Red, Black
B White, Orange, Green
C Red, Green, Yellow
D Orange, Green
至:
No Colors CombColors
A Red,Black Red, Black
B White,Orange,Green White, Orange, White, Green, Orange, Green
C Red,Green,Yellow Red, Green, Red, Yellow, Green, Yellow
D Orange,Green Orange, Green
with: df.apply(lambda x: list(it.combinations(x,2), axis =1)
但这也不起作用(每行中的所有组合)。
实现所需输出(尝试 1 或尝试 2)的正确解决方案是什么?
编辑:1
如果我尝试使用 df.apply(lambda x: list(it.combinations(x,2), axis =1)
我会生成以下列
No Colors CombColors
A Red,Black [([Red, Black], [(['Red', 'Black'], ['White'..
B White,Orange,Green [([White, Orange, Green], [(['Red', 'Black']...
C Red,Green,Yellow [([Red, Green], [(['Red', 'Black'], ['White'...
D Orange,Green [([Yellow, Orange, Green], [(['Red', 'Black']...
我认为问题是,我通过元组或列表聚合颜色(元组为空 [])。 df.groupby("No")["Color"].apply(list).agg(tuple).to_frame()
然而,itertool 为我提供了每一列的组合。
编辑 2: alparslan mimaroğlu 和 Henry Vik 的解决方案都有效,并且(对我而言)令人惊讶。直到现在我还无法理解这些背后的逻辑,但我会尝试!谢谢!
您可以按否分组并轻松创建您想要的列表。
def combinations(group):
return pd.Series(list(it.combinations(group['Color'].unique(), 2)))
df.groupby('No').apply(combinations).explode()
如果你不让它爆炸,它会return你一个颜色组合列表
IIUC 你可以使用 groupby
和 agg
:
print (df.groupby("No").agg(Colors=("Color", ", ".join),
CombColors=("Color", lambda d: ", ".join(chain.from_iterable(combinations(d, 2))))))
Colors CombColors
No
A Red, Black Red, Black
B White, Orange, Green White, Orange, White, Green, Orange, Green
C Red, Green Red, Green
D Yellow, Orange, Green Yellow, Orange, Yellow, Green, Orange, Green