我有一个非常简单的问题,但我无法实现自己想要的。 我有一个看起来像这样的DataFrame:
rsync -r /source_folder /destination_folder
我想删除每个列表的第二个元素,所以我会得到这个:
base
[a,b,c]
[c,d,e]
[a,b,h]
我想有一种简单的方法可以做到这一点,但是在DataFrames中使用列表并不是很常见,所以我什么也没找到。
谢谢。
编辑:DataFrame仅是一列,它由长度相同的列表组成。我需要删除一个元素,因此列表的长度与它将变为的DataFrame的列数相同。
答案 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]]