是否可以计算方法链中的一行和前一行之间的列表列中的公共项的数量? 我下面的代码抛出错误 'TypeError: unhashable type: 'list''
import pandas as pd
df = pd.DataFrame({
'x':[1,2,3,4],
'list_column': [
['apple', 'banana', 'cherry'],
['banana', 'cherry'],
['cherry', 'date', 'fig'],
['orange']
]
})
res = len(set(df.loc[1,'list_column']) & set(df.loc[0,'list_column']))
res
df=(df
.assign(
list_length=lambda x: x['list_column'].str.len(),
nr_common=lambda x: (set(x['list_column']) & set(x['list_column'].shift(1))).len()
)
)
df
遇到的错误是由于尝试在整个
Series
对象(
x['list_column']
)上使用
set
运算,而不是列表列中的各个列表元素上使用。
可以使用
apply
函数对 DataFrame 的每一行应用一个函数来解决这个问题,该函数计算当前行和前一行之间列表的公共元素数量。
以下是修改后的代码:
import pandas as pd
df = pd.DataFrame({
'x':[1,2,3,4],
'list_column': [
['apple', 'banana', 'cherry'],
['banana', 'cherry'],
['cherry', 'date', 'fig'],
['orange']
]
})
def count_common_elements(row):
if row.name == 0:
return 0
else:
prev_row = df['list_column'].iloc[row.name - 1]
return len(set(row['list_column']) & set(prev_row))
df['nr_common'] = df.apply(count_common_elements, axis=1)
print(df)
代码解释:
-
count_common_elements(row)
函数: - 接受 DataFrame 的一行作为输入。
-
如果是第一行 (
row.name == 0
),则返回 0,因为没有前一行可以比较。 -
否则,获取前一行的
list_column
值。 -
使用
set
运算计算当前行和前一行列表中的公共元素数量,并返回该数量。 -
df.apply(count_common_elements, axis=1)
: -
将
count_common_elements
函数应用于 DataFrame 的每一行 (axis=1
)。 -
将结果存储在一个名为
nr_common
的新列中。
现在,
df
DataFrame 将包含一个名为
nr_common
的新列,其中包含列表列中每对连续行之间的公共元素数量。