从pandas DataFrame的列中的每个列表中删除元素

时间:2018-10-02 15:08:46

标签: python pandas list

我有一个非常简单的问题,但我无法实现自己想要的。 我有一个看起来像这样的DataFrame:

rsync -r  /source_folder /destination_folder

我想删除每个列表的第二个元素,所以我会得到这个:

base
[a,b,c]
[c,d,e]
[a,b,h]

我想有一种简单的方法可以做到这一点,但是在DataFrames中使用列表并不是很常见,所以我什么也没找到。

谢谢。

编辑:DataFrame仅是一列,它由长度相同的列表组成。我需要删除一个元素,因此列表的长度与它将变为的DataFrame的列数相同。

4 个答案:

答案 0 :(得分:5)

请勿连续使用list

熊猫系列不适用于保存列表。您将失去两层指针的所有功能和性能:一层带有object dtype数组,另一层对应于系列中的每个列表。

由于每个列表具有相同数量的元素,因此请分成几列:

df = pd.DataFrame({'base': [list('abc'), list('cde'), list('abh')]})

res = pd.DataFrame(df['base'].values.tolist()).iloc[:, [0, 2]]

print(res)

   0  2
0  a  c
1  c  e
2  a  h

答案 1 :(得分:5)

IIUC

df.base=pd.DataFrame(df.base.values.tolist()).drop(1,1).values.tolist()
df
Out[635]: 
     base
0  [a, c]
1  [c, e]
2  [a, h]

答案 2 :(得分:1)

您可以处理基础的SELECT a.* FROM ( SELECT * , o.methodName oldName , n.methodName newName , s.firstName fName , s.lastName lName FROM changeReport r LEFT JOIN methodLookup o ON o.methodID = r.oldMethod LEFT JOIN methodLookup n ON n.methodID = r.newMethod JOIN students s ON s.studentID = r.studentID LEFT JOIN staffaccounts a ON r.staffID = a.staffID WHERE 31 IN (newSubMethod,oldSubMethod) AND date(timestamp) = CURRENT_DATE ) a JOIN ( SELECT students.studentID , MAX(timestamp) timestamp FROM changeReport r LEFT JOIN methodLookup o ON o.methodID = r.oldMethod LEFT JOIN methodLookup n ON n.methodID = r.newMethod JOIN students s ON s.studentID = r.studentID LEFT JOIN staffaccounts a ON r.staffID = a.staffID WHERE 31 IN (newSubMethod,oldSubMethod) AND date(timestamp) = CURRENT_DATE ) b ON b.studentID = a.studentID AND b.timestamp = a.timestamp;

np.array

答案 3 :(得分:0)

您可以使用df['base'].apply(lambda x: x.pop(1))。请注意,pop起作用,因此您无需将结果分配给base(实际上,如果这样做,您将获得删除的元素而不是其余列表)。

但是,正如@jpp所说,您应该考虑使用其他数据结构,例如具有多索引或三维numpy数组的数据框。

考虑到您的编辑,将数据转换为具有多列的数据框,然后删除多余的列可能要容易得多,而不是尝试操纵列表的列然后将其转换为最终的数据框。仅具有“一列”似乎更简单,但是您只是将额外的复杂性放在了单独的一层中,而不是摆脱它。 Pandas是围绕表示为列和行的二维数据构建的,而不是列表的单列,因此您将不使用Pandas提供的工具。

大概是这样的:

data=[['a','b','c'],
['c','d','e'],
['a','b','h']]

您做了这样的事情:

df = pd.DataFrame({'base':data})

您应该这样做

df = pd.DataFrame(data)
df = df[[0,2]]