我有一个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
如何将此类型的列表转换为二进制表?
答案 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)
以下方法:
定义 lst
在 lst
计算列表中每个元组的出现次数
创建数据框
在这里实施:
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)
只需stack
和get_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创建表格数据。