Python Panda csv itertools组合
我的数据集看起来像这样Python Panda csv itertools组合,python,python-3.x,pandas,csv,itertools,Python,Python 3.x,Pandas,Csv,Itertools,我的数据集看起来像这样 Col1 Col2 Col3 A 10 x1 B 100 x2 C 1000 x3 这就是我得到的输出的样子 Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8 Col9 A 10 x1 Empty Empty Empty Empty Empty Empty B
Col1 Col2 Col3
A 10 x1
B 100 x2
C 1000 x3
这就是我得到的输出的样子
Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8 Col9
A 10 x1 Empty Empty Empty Empty Empty Empty
B 100 x2 Empty Empty Empty Empty Empty Empty
C 1000 x3 Empty Empty Empty Empty Empty Empty
A 10 x1 B 100 x2 Empty Empty Empty
B 100 x2 C 1000 x3 Empty Empty Empty
A 10 x1 B 100 x2 C 1000 x3
多亏了这个网站的帮助,这可以用-
arr = list(itertools.chain.from_iterable(
[[j for i in el for j in i] for el in itertools.combinations(df.values.tolist(), i)]
for i in range(1, len(df)+1)
)
)
pd.DataFrame(arr)
但如果数据集如下所示
Col1 Col2 Col3 Structure
A 10 x1 1
B 100 x2 1
C 1000 x3 2
而输出需要是这样的-
Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8 Col9 Answer
A 10 x1 Empty Empty Empty Empty Empty Empty No
B 100 x2 Empty Empty Empty Empty Empty Empty No
C 1000 x3 Empty Empty Empty Empty Empty Empty Yes
A 10 x1 B 100 x2 Empty Empty Empty Yes
B 100 x2 C 1000 x3 Empty Empty Empty No
A 10 x1 B 100 x2 C 1000 x3 No
这基本上是说A和B是“是的”,因为它们在同一个结构中,而C本身是“是的,因为它本身就在这个结构中”。
所有其他行(如A、B、ABC)都是“否”,因为它们不在相同的结构中。如何获得上述所需表格
代码
arr = list(itertools.chain.from_iterable(
[[j for i in el for j in i] for el in itertools.combinations(df.values.tolist(), i)]
for i in range(1, len(df)+1)
)
)
pd.DataFrame(arr)
给我这个输出
Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8 Col9
A 10 x1 Empty Empty Empty Empty Empty Empty
B 100 x2 Empty Empty Empty Empty Empty Empty
C 1000 x3 Empty Empty Empty Empty Empty Empty
A 10 x1 B 100 x2 Empty Empty Empty
B 100 x2 C 1000 x3 Empty Empty Empty
A 10 x1 B 100 x2 C 1000 x3
如何将“答案”列添加到此输出以获得最终表格 由于数据帧的结构,我们知道当我们应用
itertools.compositions
时,structure
列将首先显示在第三列中,然后每四列显示一次:
0 1 2 3 4 5 6 7 8 9 10 11
0 A 10 x1 1 None NaN None NaN None NaN None NaN
1 B 100 x2 1 None NaN None NaN None NaN None NaN
2 C 1000 x3 2 None NaN None NaN None NaN None NaN
3 A 10 x1 1 B 100.0 x2 1.0 None NaN None NaN
4 A 10 x1 1 C 1000.0 x3 2.0 None NaN None NaN
5 B 100 x2 1 C 1000.0 x3 2.0 None NaN None NaN
6 A 10 x1 1 B 100.0 x2 1.0 C 1000.0 x3 2.0
我们可以使用它仅为结构
列编制索引,检查它们是否包含组的所有成员,然后删除它们:
checker = df.groupby('Structure').size().to_dict()
def helper(row):
u = row[~row.isnull()].values
return (len(np.unique(u)) == 1) & (checker[u[0]] == len(u))
s = out[out.columns[3::4]].apply(helper, 1).replace({False: 'No', True: 'Yes'})
0 No
1 No
2 Yes
3 Yes
4 No
5 No
6 No
dtype: object
要删除其他列并分配给数据帧,请执行以下操作:
out.drop(out.columns[3::4], 1).assign(final=s)
0 1 2 4 5 6 8 9 10 final
0 A 10 x1 None NaN None None NaN None No
1 B 100 x2 None NaN None None NaN None No
2 C 1000 x3 None NaN None None NaN None Yes
3 A 10 x1 B 100.0 x2 None NaN None Yes
4 A 10 x1 C 1000.0 x3 None NaN None No
5 B 100 x2 C 1000.0 x3 None NaN None No
6 A 10 x1 B 100.0 x2 C 1000.0 x3 No
这只是一个观察,因为我需要更多的思考来回答您的问题,但我真的不确定我是否愿意承担维护您当前使用的方法的任务。这里有很多事情要做。我相信一种方法可以是连接col1、col4和col7,并将左连接到原始df。只要存在结构匹配,就可以得到值。将其替换为“是”,将其替换为“否”。另一种方法可以首先连接列并使用lambda,但它需要反复迭代之前的df,因此早期方法应该更好。如果您打算使用我发布的代码作为对其他问题的回答,也许考虑接受它作为一个答案:P@user3483203,我想是的!刚刚检查并接受了它!你介意帮我解决这个问题吗P