Мои данные в code snippet ниже относятся.

Я застрял в попытке отфильтровать значения внутри списка словарей на шаге 2.

**Desired goal:**

0      0.00\0.00
1    1.765\n2.035
2      0.00\n0.00
3      1.65\n2.21

Где 0,00 значения отфильтровываются, потому что 'P' конкретная пара "ключ-значение" нежелательна, т.е. 8,50 в данном случае. Я хочу вернуть только значения 6,00 и по умолчанию любое другое значение 0,00.

Step1:

data = [[{'A': 2.25, 'G': 17, 'P': 8.50, 'T': 9},
  {'A': 1.63, 'G': 17, 'P': 8.50, 'T': 10}],
 [{'A': 1.765, 'G': 17, 'P': 6.00, 'T': 9},
  {'A': 2.035, 'G': 17, 'P': 6.00, 'T': 10}],
 [{'A': 2.33, 'G': 17, 'P': 8.50, 'T': 9},
  {'A': 1.59, 'G': 17, 'P': 8.50, 'T': 10}],
 [{'A': 1.65, 'G': 17, 'P': 6.00, 'T': 9},
  {'A': 2.21, 'G': 17, 'P': 6.00, 'T': 10}]]
Step2:

df = pd.Series(pd.DataFrame(data).applymap(lambda x:x['C']).astype('str').values.tolist()).str.join("\n")
df
0      2.25\1.63
1    1.765\n2.035
2      2.33\n1.59
3      1.65\n2.21

Как видите, значения в строках (0) и (3) должны быть 0,00 \ n0,00 по желанию .

Помощь очень ценится.

1
stephen.m 20 Янв 2021 в 02:37

2 ответа

Лучший ответ

Это соответствует вашему выводу. Столбец 2 - это результат:

Вход:

data = [[{'A': 2.25, 'G': 17, 'P': 8.50, 'T': 9},
  {'A': 1.63, 'G': 17, 'P': 8.50, 'T': 10}],
 [{'A': 1.765, 'G': 17, 'P': 6.00, 'T': 9},
  {'A': 2.035, 'G': 17, 'P': 6.00, 'T': 10}],
 [{'A': 2.33, 'G': 17, 'P': 8.50, 'T': 9},
  {'A': 1.59, 'G': 17, 'P': 8.50, 'T': 10}],
 [{'A': 1.65, 'G': 17, 'P': 6.00, 'T': 9},
  {'A': 2.21, 'G': 17, 'P': 6.00, 'T': 10}]]
df = pd.DataFrame(data)

Код:

df[2] = df[0].apply(lambda x: ['0.00\\0.00'  for (a,b) in x.items() if a == 'P' if b == 8.5]).str[0]
df[2] = (df[2].fillna(df[0].apply(lambda x: [f'{b}' for (a,b) in x.items() if a == 'A']).str[0] + '\n' +
         df[1].apply(lambda x: [f'{b}' for (a,b) in x.items() if a == 'A']).str[0]))
df

Выход:

Out[1]: 
                                         0  \
0   {'A': 2.25, 'G': 17, 'P': 8.5, 'T': 9}   
1  {'A': 1.765, 'G': 17, 'P': 6.0, 'T': 9}   
2   {'A': 2.33, 'G': 17, 'P': 8.5, 'T': 9}   
3   {'A': 1.65, 'G': 17, 'P': 6.0, 'T': 9}   

                                          1              2  
0   {'A': 1.63, 'G': 17, 'P': 8.5, 'T': 10}      0.00\0.00  
1  {'A': 2.035, 'G': 17, 'P': 6.0, 'T': 10}   1.765\n2.035  
2   {'A': 1.59, 'G': 17, 'P': 8.5, 'T': 10}      0.00\0.00  
3   {'A': 2.21, 'G': 17, 'P': 6.0, 'T': 10}     1.65\n2.21  

Полное объяснение и вывод с дополнительными промежуточными столбцами:

data = [[{'A': 2.25, 'G': 17, 'P': 8.50, 'T': 9},
  {'A': 1.63, 'G': 17, 'P': 8.50, 'T': 10}],
 [{'A': 1.765, 'G': 17, 'P': 6.00, 'T': 9},
  {'A': 2.035, 'G': 17, 'P': 6.00, 'T': 10}],
 [{'A': 2.33, 'G': 17, 'P': 8.50, 'T': 9},
  {'A': 1.59, 'G': 17, 'P': 8.50, 'T': 10}],
 [{'A': 1.65, 'G': 17, 'P': 6.00, 'T': 9},
  {'A': 2.21, 'G': 17, 'P': 6.00, 'T': 10}]]
df = pd.DataFrame(data)

#condition of a key-value pair being P and 8.5...
# ...calling x.items() allows you to simultaneously loop through key value pairs 
# ...and return the desired output for the condition while NaN for those that don't meet it
#... we use list comprehension to achieve this and you can use `.str[0]` to transform from list with one value to value
df[2] = df[0].apply(lambda x: ['0.00\\0.00'  for (a,b) in x.items() if a == 'P' if b == 8.5]).str[0]

#... just like above logic is easier but conditionally return values if A for column 1
df[3] = df[0].apply(lambda x: [f'{b}' for (a,b) in x.items() if a == 'A']).str[0]

#... just like above logic is easier but conditionally return values if A for column 2
df[4] = df[1].apply(lambda x: [f'{b}' for (a,b) in x.items() if a == 'A']).str[0]

# fill NaN values for column 3 with combined string of columns 4 and 5
df[5] = df[2].fillna(df[3] + '\n' + df[4])
df
Out[839]: 
                                         0  \
0   {'A': 2.25, 'G': 17, 'P': 8.5, 'T': 9}   
1  {'A': 1.765, 'G': 17, 'P': 6.0, 'T': 9}   
2   {'A': 2.33, 'G': 17, 'P': 8.5, 'T': 9}   
3   {'A': 1.65, 'G': 17, 'P': 6.0, 'T': 9}   

                                          1          2      3      4  \
0   {'A': 1.63, 'G': 17, 'P': 8.5, 'T': 10}  0.00\0.00   2.25   1.63   
1  {'A': 2.035, 'G': 17, 'P': 6.0, 'T': 10}        NaN  1.765  2.035   
2   {'A': 1.59, 'G': 17, 'P': 8.5, 'T': 10}  0.00\0.00   2.33   1.59   
3   {'A': 2.21, 'G': 17, 'P': 6.0, 'T': 10}        NaN   1.65   2.21   

              5  
0     0.00\0.00  
1  1.765\n2.035  
2     0.00\0.00  
3    1.65\n2.21  
1
David Erickson 20 Янв 2021 в 00:40
df = pd.DataFrame(data)
df.apply(lambda x: f'''{x[0]['A'] if x[0]['P'] == 6.00 else '0.00'}
{x[1]['A'] if x[1]['P'] == 6.00 else '0.00'}''', axis=1)

# 0      0.00\n0.00
# 1    1.765\n2.035
# 2      0.00\n0.00
# 3      1.65\n2.21
0
Ferris 20 Янв 2021 в 03:23