熊猫将数据框转换为元组数组而没有None

时间:2019-03-30 11:05:56

标签: python pandas

我正在使用Apriori算法分析一些数据。这要求我将数据框转换为元组数组,每个元组都对应于数据框的“行”。

In [1]: data
Out[1]: 
     c1   c2   c3   c4   c5
r1   a    b    c    d    None
r2   a    b    c    None None

我尝试了下面的代码,但其中仍然有一些“无”。我要删除它们。

In [2]: data = [tuple(x) for x in data.values]
Out[2]: 
[('a','b','c','d',None),('a','b','c',None,None)]

我希望这样的数据:

[('a','b','c','d'),('a','b','c')]

4 个答案:

答案 0 :(得分:4)

对过滤使用嵌套列表理解:

data = [tuple([y for y in x if y is not None]) for x in data.values]
print (data)
[('a', 'b', 'c', 'd'), ('a', 'b', 'c')]

如果数据量较大,则选择更慢的方法-重新整形以删除None,并按元组的第一级MultiIndex进行聚合:

data = data.stack().groupby(level=0).apply(tuple).tolist()
print (data)
[('a', 'b', 'c', 'd'), ('a', 'b', 'c')]

答案 1 :(得分:4)

我们也可以在理解中使用filter以获得所需的结果。只要确保您的None都不是字符串即可。

data = [tuple(filter(None, x)) for x in data.values]

print(data)
# [('a', 'b', 'c', 'd'), ('a', 'b', 'c')]

答案 2 :(得分:1)

另一种过滤None的方法是:

data_without_none = [tuple(row[row != None]) for row in data.values]

答案 3 :(得分:1)

另一种方法可能是使用转置+ apply():

model.fit_generator(
train_generator,
class_weight=class_weights,
steps_per_epoch=nb_train_samples // batch_size,
epochs=epochs,
validation_data=validation_generator,
validation_steps=nb_validation_samples // batch_size,
callbacks=my_callbacks
)