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