Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在数据框中动态创建所有列组合_Python_Python 3.x_Loops_Combinatorics_Itertools - Fatal编程技术网

Python 在数据框中动态创建所有列组合

Python 在数据框中动态创建所有列组合,python,python-3.x,loops,combinatorics,itertools,Python,Python 3.x,Loops,Combinatorics,Itertools,我有一个数据框df,里面有列和字符串值。 我的目标是创建一个数据框final\u df,其列表示df列的所有可能组合,包括它们的值(理想情况下由\uuu[不在示例代码中]分隔) 示例代码: import pandas as pd from itertools import combinations d = {'AAA': ["xzy", "gze"], 'BBB': ["abc", "hja"], 'CCC': ["dfg", "hza"], 'DDD': ["hij", "klm"], '

我有一个数据框
df
,里面有列和字符串值。 我的目标是创建一个数据框
final\u df
,其列表示
df
列的所有可能组合,包括它们的值(理想情况下由
\uuu
[不在示例代码中]分隔)

示例代码:

import pandas as pd
from  itertools import combinations

d = {'AAA': ["xzy", "gze"], 'BBB': ["abc", "hja"], 'CCC': ["dfg", "hza"], 'DDD': ["hij", "klm"], 'EEE': ["lal", "opa"]}
df = pd.DataFrame(data=d)

# two combinations
cc = list(combinations(df.columns,2))
df_2 = pd.concat([df[c[0]] + df[c[1]] for c in cc], axis=1, keys=cc)
df_2.columns = df_2.columns.map(''.join)

# three attributes
del cc
cc = list(combinations(df.columns,3))
df_3 = pd.concat([df[c[0]] + df[c[1]] + df[c[2]] for c in cc], axis=1, keys=cc)
df_3.columns = df_3.columns.map(''.join)

# four attributes
del cc
cc = list(combinations(df.columns,4))
df_4 = pd.concat([df[c[0]] + df[c[1]] + df[c[2]] + df[c[3]] for c in cc], axis=1, keys=cc)
df_4.columns = df_4.columns.map(''.join)

# five attributes
del cc
cc = list(combinations(df.columns,5))
df_5 = pd.concat([df[c[0]] + df[c[1]] + df[c[2]] + df[c[3]] + df[c[4]] for c in cc], axis=1, keys=cc)
df_5.columns = df_5.columns.map(''.join)

# join dataframes
dfs = [df, df_2, df_3, df_4, df_5]
final_df = dfs[0].join(dfs[1:])

是否有一种Pythonic方法可以根据列的数量动态地创建这样一个
最终的数据帧?

但是我想到了一个解决方案。。。列名不会更改

def combodf(dfx, x): 
    d = (['_'.join(i) for i in zip(*a)] for a in combinations(df.T.values.tolist(), x)) 
    return pd.DataFrame(d).T 

final_df = pd.concat([df, *(combodf(df, i) for i in range(2,6))], 1) 
但是从你的“列”结构来看,把它们作为值会更有意义。这里有一个变通方法,我们将列移动到最后一行

import pandas as pd
from itertools import combinations

def combodf(dfx, x):
    d = [['_'.join(i) for i in zip(*a)] for a in combinations(df.T.values.tolist(), x)]
    return pd.DataFrame(d).T

d = {
'AAA': ["xzy", "gze"], 
'BBB': ["abc", "hja"], 
'CCC': ["dfg", "hza"], 
'DDD': ["hij", "klm"], 
'EEE': ["lal", "opa"]
}

df = pd.DataFrame(data=d)
df.loc[len(df)] = df.columns # insert columns last row
df = pd.concat([df, *(combodf(df, i) for i in range(2,6))], 1)
df.columns = df.tail(1).values[0] # make last row columns
df = df.drop(2) # drop last row

比较:

print((df == final_df).all().all()) # True
print((df.columns == final_df.columns).all()) # True

让我们来看一下,通过从itertools导入组合,它可以完美地用于示例,但是通过添加更多的列或行,不幸的是,它不起作用anymore@Constantin给我举个例子。出去吃午饭,如果你删除了被接受的答案,也许其他人可以看看。