熊猫 csv itertools 组合

Posted

技术标签:

【中文标题】熊猫 csv itertools 组合【英文标题】:Panda csv itertools combinations 【发布时间】:2018-08-06 13:59:43 【问题描述】:

我的数据集是这样的,

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

如何将“答案”列添加到此输出中以获得最终表格?

【问题讨论】:

这只是一个观察,因为尝试回答您的问题需要我多花点心思,但我真的不确定我是否要负责维护您目前的方法使用。那里发生了很多事情。 我相信一种方法是连接 col1、col4 和 col7 并左连接到原始 df。无论哪里有结构匹配,你都会得到价值。将其替换为“是”并用“否”替换 另一种方法可以先连接列并使用 lambda,但它需要一次又一次地迭代前一个 df,因此早期的方法应该更好。 如果您打算使用我发布的代码作为您其他问题的答案,不妨考虑接受它作为答案:P @user3483203,我以为我做到了!刚刚检查并接受了它!你介意现在帮我解决这个问题吗? :P 【参考方案1】:

由于DataFrame的结构,我们知道当我们应用itertools.combinations时,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

我们可以使用它来仅索引Structure 列,检查它们是否包含组的所有成员,然后删除它们:

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

删除其他列并分配给 DataFrame:

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

【讨论】:

以上是关于熊猫 csv itertools 组合的主要内容,如果未能解决你的问题,请参考以下文章

itertools 排列组合

itertools---排列组合

itertools:获取操作( + - * / )和列的组合

Itertools.product 自定义每个输入的组合数量?

itertools 组合和产品 [关闭]

python itertools模块实现排列组合