Получить образец агрегированных значений строк с пандами - PullRequest
0 голосов
/ 15 ноября 2018

Мне нужна функция, которая задает фрейм данных и число num создает фрейм данных с num строками, так что каждая строка имеет следующее значение: - для столбцов со строковыми значениями мы выбираем значение из столбца висходная таблица - для столбцов с плавающей точкой или целыми числами мы находим среднее значение

Вот мой код

def rows_aggr(df, num):
    dataframe = None
    for i in range(0, num):
        row = None
        for cname in df.columns.values:
            column = df[cname]
            dfcol = Series.to_frame(column)

            if column.dtype != np.number:
                item = dfcol.sample(n=1)
            else:
                item = dfcol.mean(axis=1)

            if row is None:
                row = item
            else:
                row = pd.concat([row, item], axis=1)

        if dataframe is None:
            dataframe = row
        else:
            dataframe = pd.concat([dataframe, row], axis=0)

    return dataframe

, по некоторым причинам строки содержат значения nan и превышают num ... и этоКод, кажется, не работает правильно.Если бы вы знали лучший способ выполнить то, что мне нужно, я был бы рад узнать.

для

df = pd.DataFrame({'col1':list('abcdef'),'col2':range(6)}) and num=3

мы бы получили что-то вроде

c, 2.5
f, 2.5
b, 2.5

, предполагая иc, f, b были выбраны случайным образом

Спасибо!

1 Ответ

0 голосов
/ 15 ноября 2018

Одна ошибка кажется, что условие column.dtype != np.number не работает.Тогда возникает проблема с выравниванием индекса, когда вы делаете pd.concat([row, item], axis=1), item содержит номер индекса, который не всегда одинаков, и это добавляет строки с Nan в row.Вот еще один способ сделать это.

SETUP

df = pd.DataFrame({'col1':list('abcdef'),'col2':list('ijklmn'),
                   'col3':range(6),'col4':np.arange(10,16)/1.5})
print (df)
  col1 col2  col3       col4
0    a    i     0   6.666667
1    b    j     1   7.333333
2    c    k     2   8.000000
3    d    l     3   8.666667
4    e    m     4   9.333333
5    f    n     5  10.000000

. Вы можете использовать select_dtypes, чтобы проверить, не является ли столбец числовым, и создать кадр данных ссловарное понимание типа:

def rows_aggr(df, num):
    list_col_notnumeric = df.select_dtypes(exclude=[np.number]).columns
    return pd.DataFrame({col: df[col].sample(num).values
                              if col in list_col_notnumeric  
                              else df[col].mean() 
                         for col in df.columns})

print (rows_aggr(df, 3))
  col1 col2  col3      col4
0    d    i   2.5  8.333333
1    a    n   2.5  8.333333
2    c    j   2.5  8.333333
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...