二进制表中的元组列表?

时间:2017-12-13 00:39:10

标签: python list pandas dataframe data-structures

我有一个Python中具有不同数量或元素的事务/元组列表,如下所示:

lst = [('apple','banana','carrots'),('apple',),('banana','carrots',)]

我想以表格形式(最好是pd.DataFrame)存储此列表,例如:

   apple  banana  carrots
0      1       1        1
1      1       0        0
2      0       1        1

但如果尝试使用pd.DataFrame直接转换,我会改为:

pd.DataFrame(lst)
        0        1        2
0   apple   banana  carrots
1   apple     None     None
2  banana  carrots     None

如何将此类型的列表转换为二进制表?

7 个答案:

答案 0 :(得分:10)

如果您使用value_counts而不是列

,这非常简单
pd.DataFrame(lst).apply(pd.value_counts,1).fillna(0)

    apple  banana  carrots
0    1.0     1.0      1.0
1    1.0     0.0      0.0
2    0.0     1.0      1.0

答案 1 :(得分:7)

以下方法:

  1. 定义 lst

  2. lst

  3. 中查找所有唯一字符串
  4. 计算列表中每个元组的出现次数

  5. 创建数据框

  6. 在这里实施:

    import pandas as pd
    import numpy as np
    
    lst = [('apple','banana','carrots'),('apple',),('banana','carrots',)]
    cols = np.unique(sum(tuple(lst),()))
    data = [[i.count(j) for j in cols] for i in lst]
    df = pd.DataFrame(columns=cols, data=data)
    

    输出:

       apple  banana  carrots
    0      1       1        1
    1      1       0        0
    2      0       1        1
    

答案 2 :(得分:7)

让我们试试get_dummies + groupby + sum -

pd.get_dummies(pd.DataFrame(lst)).groupby(by=lambda x: x.split('_')[1], axis=1).sum()

   apple  banana  carrots
0      1       1        1
1      1       0        0
2      0       1        1

这应该很快。

答案 3 :(得分:3)

只需stackget_dummies

pd.DataFrame(lst).stack().str.get_dummies().sum(level=0)
Out[114]: 
   apple  banana  carrots
0      1       1        1
1      1       0        0
2      0       1        1

答案 4 :(得分:0)

你可以试试这个:

import itertools
class Table:
   def __init__(self, data):
      self.lst = data
      self.headers = headers = list(set(itertools.chain(*self.lst)))
      self.new_count = {i:[b.count(i) for b in self.lst] for i in self.headers}
   def __getitem__(self, row):
       if isinstance(row, int):
           return [d[row] for c, d in sorted(self.new_count.items(), key=lambda x:x[0])]
       return self.new_count[row]
   def __repr__(self):
       return ' '.join(sorted(self.new_count.keys()))+'\n'+'\n'.join('{}. {}'.format(i, ' '.join(map(str, d))) for i, d in enumerate(zip(*[e[-1] for e in sorted(self.new_count.items(), key=lambda x:x[0])])))

lst = [('apple','banana','carrots'),('apple',),('banana','carrots',)]
t = Table(lst)
print(t)

输出:

apple banana carrots
0. 1 1 1
1. 1 0 0
2. 0 1 1

答案 5 :(得分:0)

创建一个包含转换为二进制的项目的临时列表,然后使用Dataframe 编写一个循环,将每个项目转换为二进制。

def pad_collection(collection, pad_value):
    sorted_collection = sorted(collection, key=lambda tup: len(tup))
    max_length = len(sorted_collection[-1])
    for item in collection:
        for i in range (max_length - len(item)):
            item.append(pad_value)
    return collection

def convert_to_binary(collection):
    result = []
    padded_collection = pad_collection(collection)
    for i in padded_collection:
        temp = []
        for element in i:
            new_element = int(bool(element))
            temp.append(new_element)
        result.append(tuple(temp))
    return padded_collection

答案 6 :(得分:0)

您可以在不导入任何外部模块的情况下尝试纯逻辑,

lst = [('apple','banana','carrots'),('apple',),('banana','carrots',)]

track_uniqu=[]
for i in lst:
    for k in i:

        if k not in track_uniqu:
            track_uniqu.append(k)

final={}
for i,j in enumerate(lst):

    dummy=[0]*len(track_uniqu)

    for k in j:
        if k in track_uniqu:

            dummy[track_uniqu.index(k)]=1
            final[i]=dummy
        else:
            pass
print(final)

输出:

{0: [1, 1, 1], 1: [1, 0, 0], 2: [0, 1, 1]}

结果是dict格式,但您可以根据需要从此dict创建表格数据。