Для каждой строки в пандах, делайте до изменения идентификатора образца - PullRequest
1 голос
/ 10 октября 2019

Как перебрать строки в кадре данных до изменения идентификатора образца?

my_df:

ID        loc_start
sample1   10
sample1   15
sample2   10
sample2   20
sample3   5

Что-то вроде:

samples = ["sample1", "sample2" ,"sample3"] 

out = pd.DataFrame()
for sample in samples:
    if my_df["ID"] == sample:
        my_list = []
        for index, row in my_df.iterrows():
            other_list = [row.loc_start]
            my_list.append(other_list)
        my_list = pd.DataFrame(my_list)
        out = pd.merge(out, my_list) 

Ожидаемый результат:

sample1   sample2   sample3
     10        10         5    
     15        20

Я, конечно, понимаю, что это можно было бы сделать проще, если бы my_df действительно выглядел так. Тем не менее, мне нужен принцип перебора строк до тех пор, пока не изменится значение определенного столбца.

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Ben.T правильно, что здесь работает пивот. Вот пример:

import pandas as pd
import numpy as np

df = pd.DataFrame(data=np.random.randint(0, 5, (10, 2)), columns=list("AB"))

# what does the df look like?  Here, I consider column A to be analogous to your "ID" column

In [5]: df
Out[5]: 
   A  B
0  3  1
1  2  1
2  4  2
3  4  1
4  0  4
5  4  2
6  4  1
7  3  1
8  1  1
9  4  0


# now do a pivot and see what it looks like
df2 = df.pivot(columns="A", values="B")

In [8]: df2
Out[8]: 
A    0    1    2    3    4
0  NaN  NaN  NaN  1.0  NaN
1  NaN  NaN  1.0  NaN  NaN
2  NaN  NaN  NaN  NaN  2.0
3  NaN  NaN  NaN  NaN  1.0
4  4.0  NaN  NaN  NaN  NaN
5  NaN  NaN  NaN  NaN  2.0
6  NaN  NaN  NaN  NaN  1.0
7  NaN  NaN  NaN  1.0  NaN
8  NaN  1.0  NaN  NaN  NaN
9  NaN  NaN  NaN  NaN  0.0

Не совсем то, что вы хотели. С небольшой помощью от ответа Джезреала

df2 = df2.apply(lambda x: pd.Series(x.dropna().values))

In [20]: df3
Out[20]: 
A    0    1    2    3    4
0  4.0  1.0  1.0  1.0  2.0
1  NaN  NaN  NaN  1.0  1.0
2  NaN  NaN  NaN  NaN  2.0
3  NaN  NaN  NaN  NaN  1.0
4  NaN  NaN  NaN  NaN  0.0

Пустые места в кадре данных должны быть заполнены чем-то, и NaN используется по умолчанию. Это то, что вы хотели?

Если, с другой стороны, вы хотите выполнить операцию с вашими данными, вы бы вместо этого использовали groupby.

df2 = df.groupby (by = "A", as_index = False) .mean ()

0 голосов
/ 10 октября 2019

На основании предоставленного ввода и вывода это должно работать. Вам нужно предоставить больше информации, если вы ищете что-то еще.

df.pivot(columns='ID', values = 'loc_start').rename_axis(None, axis=1).apply(lambda x: pd.Series(x.dropna().values))

output

sample1     sample2     sample3
0   10.0    10.0    5.0
1   15.0    20.0    NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...