Как выбрать элементы списков в группе списков, если элементы (строка) начинаются с буквы / цифры? - PullRequest
1 голос
/ 24 апреля 2019

Здесь я хочу выбрать элементы в каждом списке, которые удовлетворяют условию, что они начинаются с '6'. Однако я не нашел способ достичь этого.

Списки конвертируются из кадра данных:

d = {'c1': ['64774', '60240', '60500', '19303', '38724', '11402'], 
     'c2': ['', '95868', '95867', '60271', '60502', '19125'],
     'c3':['','','','','95867','60500']} 
df= pd.DataFrame(data=d)
df
  c1     c2     c3
64774   
60240   95868
60500   95867
19303   60271
38724   60502   95867
11402   19125   60500
list = df.values.tolist()
list = str(list)
list

[['64774', '', ''],
 ['60240', '95868', ''],
 ['60500', '95867', ''],
 ['19303', '60271', ''],
 ['38724', '60502', '95867'],
 ['11402', '19125', '60500']]

Я пробовал код как:

[x for x in list if x.startswith('6')]

Однако он вернул '6' только для элементов, удовлетворяющих условию

['6', '6', '6', '6', '6', '6', '6', '6', '6']

Я ищу группу списков, таких как:

"[['64774'], ['60240'], ['60500'], ['60271'], ['60502'], ['60500']]"

Ответы [ 3 ]

2 голосов
/ 25 апреля 2019

Когда вы делаете list = str(list), вы конвертируете свой список в строковое представление, то есть list становится

"[['64774', '', ''], ['60240', '95868', ''], ['60500', '95867', ''], ['19303', '60271', ''], ['38724', '60502', '95867'], ['11402', '19125', '60500']]"

Затем вы перебираете строку с пониманием списка

[x for x in list if x.startswith('6')]

, который производит каждый отдельный символ в строке, что означает, что вы просто найдете все вхождения 6 в строке, следовательно, ваш результат

['6', '6', '6', '6', '6', '6', '6', '6', '6']

Sidenote: не используйте имена переменных, которые встроены в теневые функции, такие как list, dict и т. Д., Это почти наверняка вызовет проблемы в будущем.

Я не уверен, есть ли какая-либо конкретная причина использовать фрейм данных / панды для вашего вопроса. Если нет, вы можете просто использовать понимание списка

d = {
  'c1': ['64774', '60240', '60500', '19303', '38724', '11402'], 
  'c2': ['', '95868', '95867', '60271', '60502', '19125'],
  'c3':['','','','','95867','60500']
}

d2 = [[x] for v in d.values() for x in v if x.startswith('6')]
# d2: [['64774'], ['60240'], ['60500'], ['60271'], ['60502'], ['60500']]
1 голос
/ 24 апреля 2019

Вам не нужно преобразовывать свой список в str (список), поскольку он уже является строковым типом.

lst = df.values.tolist()
lst = [[i] for l in lst for i in l if i.startswith('6') ]
print(lst)

Результат:

[['64774'], ['60240'], ['60500'], ['60271'], ['60502'], ['60500']]
0 голосов
/ 24 апреля 2019

Попробуйте это:

flatten = lambda l: [[item] for sublist in l for item in sublist]
print( flatten([ df[col][df[col].str.startswith("6") ].tolist() for col in df]))

Здесь я использовал генератор списков, который собирает все соответствующие ячейки в списке, перебирая столбцы;это дает [['64774', '60240', '60500'], ['60271', '60502'], ['60500']].Чтобы получить желаемый результат, я определил функцию flatten, которая (несколько) выравнивает этот список до [['64774'], ['60240'], ['60500'], ['60271'], ['60502'], ['60500']].

...