J'ai un tableau qui ressemble à ceci:
a = ['UCI_99648;102568', 'UCI_99648;102568', 'UCI_99648;102568;99651', 'UCI_99651', 'UCI_99652', 'SIB_99658;102568;506010;706080', NaN]
Je veux savoir combien de piqûres ont un seul numéro comme UCI_99651 , UCI_99652
Donc, le résultat attendu est 2.
Comment puis-je faire cela en python.
REMARQUE: mes données réelles sont très volumineuses et les nombres peuvent être n'importe quoi et, comme indiqué dans l'exemple, peuvent impliquer des valeurs manquantes.
4 Réponses :
En supposant que la structure de toutes les chaînes suit celle de l'exemple ci-dessus, une compréhension de liste comme suit fera:
['UCI_99651', 'UCI_99652']
Sortie
XXX
Depuis que vous avez tagué des pandas, une autre façon:
3 UCI_99651 4 UCI_99652
s=pd.Series(a).dropna()
s[s.str.split(';').str.len().eq(1)]
Vous pouvez extraire des nombres à l'aide d'expressions régulières. Par exemple, quelque chose comme ceci:
import re
import numpy as np
from collections import Counter
def count_strings_with_unq_nums(list_of_strings):
# Initialize two lists - one to keep track of where the numbers occur and another to isolate unique occurences of numbers
all_nums_nested = []
all_nums_flat = []
# Loop through all strings and extract integers within
for s in list_of_strings:
try:
nums = re.findall(r'\d+', s)
all_nums_nested.append(nums)
all_nums_flat.extend(nums)
except:
continue
# Count occurences of all extracted numbers
num_counter = Counter(all_nums_flat)
# Loop through nested list to find strings where unique numbers occur
unq_items = []
for key, val in num_counter.items():
if val == 1:
for n, num_list in enumerate(all_nums_nested):
if key in num_list:
unq_items.append(list_of_strings[n])
# Return the number of strings containing unique numbers.
return len(set(unq_items))
if __name__ == '__main__':
a = ['UCI_99648;102568', 'UCI_99648;102568', 'UCI_99648;102568;99651', 'UCI_99651', 'UCI_99652', 'SIB_99658;102568;506010;706080', np.NaN]
print(count_strings_with_unq_nums(a))
>>> 2
Vous pouvez essayer comme ci-dessous. J'espère que cela résoudra votre problème.
p = [word.split(";")[0] for word in uci if word != 'NaN']
print(Counter(p))
#Counter({'UCI_99648': 3, 'UCI_99651': 1, 'UCI_99652': 1, 'SIB_99658': 1})
#To filter only one occurance you can try below.
b = [word for word in p if p.count(word)==1]
print(b)
Pour plus d'informations, vous pouvez consulter le document de compréhension de liste ici.
qu'est-ce qui rend les numéros UCI_99651, UCI_99652 uniques?
par unique ici, je veux dire qu'il n'y a qu'un seul numéro dans la chaîne par rapport aux autres cas. Par exemple, le code
UCI_99648; 102568comporte deux chiffres.