我有一个看起来像这样的数据框(示例):
column1 column2 column3
xyz 123 [(ab,cv), (da,ndfds)]
dsja 32421 [(ab,cv)]
dgsag 3252 [(dsfsa,sfa), (sd,sfag)]
....................
我首先想获得所有列表中出现频率最高的对。 例如:
(ab,cv) 2
(da,ndfds) 1
..........
我希望能够调用例如column3中包含条目(ab,cv)的所有行。
此的预期输出为:
column1 column2 column3
xyz 123 [(ab,cv), (da,ndfds)]
dsja 32421 [(ab,cv)]
.....................
答案 0 :(得分:1)
IIUC
ages = [
{ ageID: 100, name: "0 -10 years", isChecked: false },
{ ageID: 200, name: "10 -20 years", isChecked: false },
{ ageID: 300, name: "30 -40 years", isChecked: false },
{ ageID: 400, name: "40 -50 years", isChecked: false }];
languages = [
{ langID: 1, name: "English", isChecked: false },
{ langID: 2, name: "Tamil", isChecked: false },
{ langID: 3, name: "Hindi", isChecked: false },
{ langID: 4, name: "French", isChecked: false }];
数据输入
df[[any(y in l for y in x) for x in df.col3]]
Out[57]:
col1 col3
0 x [(ab, cv), (da, ndfds)]
1 y [(ab, cv)]
答案 1 :(得分:1)
首先,一般的评论是:Pandas很棒,但是当您开始在列内的列表中包含元组时,它可能不再是正确的工具。 Pandas专为表格数据而设计,您处理的内容显然更加结构化。
话虽如此,这是我的解决方法。
首先,让我们创建DataFrame
(以使示例易于复制):
import pandas as pd
df = pd.DataFrame({
'col_1': ['xyz', 'dsja', 'dgsag'],
'col_2': [123, 32421, 3252],
'col_3': [
[('ab','cv'),('da','ndfds')],
[('ab','cv')],
[('dsfsa','sfa'),('sd','sfag')]]
})
给出
>>> df
col_1 col_2 col_3
0 xyz 123 [(ab, cv), (da, ndfds)]
1 dsja 32421 [(ab, cv)]
2 dgsag 3252 [(dsfsa, sfa), (sd, sfag)]
现在,通过collections.Counter
进行计数很容易,并且您需要首先将所有这些列表连接起来:
from collections import Counter
Counter(t for row in df['col_3'] for t in row)
Counter({('ab', 'cv'): 2,
('da', 'ndfds'): 1,
('dsfsa', 'sfa'): 1,
('sd', 'sfag'): 1})
您获得的Counter
对象具有一个most_common
方法,该方法接受您想要的项数(例如3种最常见的项)作为参数。
现在,第二点只是逻辑索引。您可以通过loc
进行索引,并且(根据以下其他答案进行了改进)使用生成器进行比较:
t = ('ab', 'cv')
df.loc[(t in l for l in df['col_3']), :]
col_1 col_2 col_3
0 xyz 123 [(ab, cv), (da, ndfds)]
1 dsja 32421 [(ab, cv)]
答案 2 :(得分:0)
这应该做:
df[('ab','cv') in l for l in df.column3]
column1 column2 column3
0 xyz 123 [(ab,cv),(da,ndfds)]
1 dsja 32421 [(ab,cv)]