【问题标题】:How can I use a combination or a string as an Index of DataFrame (Pandas)?如何使用组合或字符串作为 DataFrame (Pandas) 的索引?
【发布时间】:2017-02-16 04:49:47
【问题描述】:

我正在尝试使用列组合在 Pandas DataFrame 中创建一个新列。由于我不知道如何使用作为索引生成的组合,我尝试将组合转换为字符串,但这也不起作用。

import itertools as iter
def pset(lst):
    comb = (iter.combinations(lst, l) for l in range(2,3))
    return list(iter.chain.from_iterable(comb))

temp = pset(transactions)
t = str(temp[0]).strip(" ")
transactions[[t]]

这给我一个错误

KeyError: '["\'A\', \'B\'"] not in index'

这里 A 和 B 是我在数据框中的列。

transaction dataset:
A,B,C,D,E,F,G
1,0,1,1,0,1,1
1,1,1,1,0,1,0
1,0,0,1,0,1,0
0,0,1,1,1,0,0
1,0,0,1,1,1,0
0,1,1,1,1,1,1

Expected output Expected output:
A,B  A,C  A,D
 1    2    4

【问题讨论】:

  • 您在寻找 pd.MultiIndex.from_product() 吗?
  • 我正在执行 apriori,我想创建一个组合同一数据帧的多个列(索引)的索引。
  • @YadyneshDesai - 你可以添加数据框样本:5 - 6 行和所需的输出吗?
  • @jezrael 我已经更新了问题。预期的输出只是我实际想要的一小部分。
  • 谢谢,但我有点困惑 - 你认为所有列的组合 A, B, C, D, E, F, G 吗?你能解释更多的数字1 ,2,4 吗?

标签: python python-3.x pandas dataframe


【解决方案1】:

您会得到这样的预期输出,df 是您发布的交易数据集。 (虽然这个解决方案是用 Python 2.7 制作的,但我希望它在 Python 3 中也能正常工作)

import itertools as iter
import pandas as pd

colComb = [a for a in iter.combinations(df.columns,2)]
newCols = [','.join(colComb[i]) for i in range(len(colComb))]

Out = pd.DataFrame(columns = newCols)
for i in range(len(colComb)):
    Out.loc[0,newCols[i]] = df[(df[colComb[i][0]] == 1) & (df[colComb[i][1]] == 1)][colComb[i][0]].count()

输出:

  A,B A,C A,D A,E A,F A,G B,C B,D B,E B,F B,G C,D C,E C,F C,G D,E D,F D,G E,F  \
0   1   2   4   1   4   1   2   2   1   2   1   4   2   3   2   3   5   2   2   

  E,G F,G  
0   1   2  

根据需要转置:

OT = Out.T
OT.columns = ["Count"]

输出:

    Count
A,B     1
A,C     2
A,D     4
A,E     1
A,F     4
A,G     1
B,C     2
B,D     2
B,E     1
B,F     2
B,G     1
C,D     4
C,E     2
C,F     3
C,G     2
D,E     3
D,F     5
D,G     2
E,F     2
E,G     1
F,G     2

编辑:

改进的代码也适用于更高维度:

import itertools as iter
import pandas as pd
import numpy as np

dim = 2
colComb = [a for a in iter.combinations(df.columns,dim)]
newCols = [','.join(colComb[i]) for i in range(len(colComb))]

Out = pd.DataFrame(columns = newCols)
for i in range(len(colComb)):
    Out.loc[0,newCols[i]] = df[np.sum(df[list(colComb[i])],axis=1) == dim][colComb[i][0]].count()

编辑:

二维码更快:

cols = []
vals = []
for i in range(len(df.columns)):
    for j in range(i+1,len(df.columns)):
        cols.append(df.columns[i]+','+df.columns[j])
        vals.append(np.multiply(df[df.columns[i]],df[df.columns[j]]).sum())

Out = pd.DataFrame(columns=cols)
Out.loc[0] = vals
Out = Out.astype(int)

另一个编辑,更高维度的更快解决方案:

vals = []
colComb = [a for a in iter.combinations(df.columns,dim)]
cols = [','.join(colComb[i]) for i in range(len(colComb))]
vals = []
for C in colComb:
    v = df[C[0]]
    for i in range(1,len(C)):
        v = np.multiply(v,df[C[i]])
    vals.append(v.sum())
dd = pd.DataFrame(columns=cols)
dd.loc[0] = vals
dd = dd.astype(int)

它应该至少快 3-4 倍。

【讨论】:

  • 谢谢。我会在大约两天后尝试这个并恢复。
  • 在上面的代码中,数据帧索引是存储为组合还是字符串?
  • 如果您执行OT = Out.T,然后查看OT.index,您将看到索引存储为字符串。如果您希望将这些字符串放在普通列中并使用通用索引,则可以使用 reset_index()
  • 这需要很多时间。
  • 如果您的数据集很大,则需要很长时间。
猜你喜欢
  • 2017-03-04
  • 1970-01-01
  • 2020-09-07
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 2011-04-10
  • 2019-10-29
  • 2016-11-22
相关资源
最近更新 更多