熊猫 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:获取操作( + - * / )和列的组合