Как добавить строки с расчетами конкретных столбцов в пандах - PullRequest
0 голосов
/ 28 августа 2018

У меня есть dtaframe, и я хотел бы добавить в его конец 2 строки, которые будут указывать, сколько ячеек было между диапазоном чисел. Я хотел бы сделать это для всех столбцов, кроме первого и последнего (у меня большой массив данных с большим количеством столбцов). Например, у меня есть следующий мелкомасштабный фрейм данных:

    start position      A     b    rnd
0        149449305      4    99     88       
1         47630133      6    50     10   
2        128200594     12     7    600   
3         49423101    100    10      8

Я бы хотел посчитать, сколько раз число находится в диапазоне от 0-9 до 10-100 только в столбцах A и B, и добавить его в конец кадра данных, указав диапазон в и столбца «начальная позиция», например:

        start position      A     b    rnd
    0        149449305      4    99     88       
    1         47630133      6    50     10   
    2        128200594     12     7    600   
    3         49423101    100    10      8
    4              0-9      2     1 
    5           10-100      2     3       

Как я могу это сделать (без указания имен столбцов, а скорее диапазона их индекса, поскольку у меня гораздо больший размер кадра данных со многими столбцами)?

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

IIUC, используя pd.cut с value_counts получить счетчик диапазона, затем мы используем append

newdf=df.iloc[:,1:-1].apply(lambda x : pd.cut(x,[0,9,100],labels=['0-9','10-100']).value_counts())
df.append(newdf.rename_axis('startposition',axis=0).reset_index())
Out[216]: 
     A   b    rnd startposition
0    4  99   88.0     149449305
1    6  50   10.0      47630133
2   12   7  600.0     128200594
3  100  10    8.0      49423101
0    2   3    NaN        10-100
1    2   1    NaN           0-9
df=df.append(newdf.rename_axis('startposition',axis=0).reset_index()).reindex(df.columns,axis=1)
df
Out[217]: 
  startposition    A   b    rnd
0     149449305    4  99   88.0
1      47630133    6  50   10.0
2     128200594   12   7  600.0
3      49423101  100  10    8.0
0        10-100    2   3    NaN
1           0-9    2   1    NaN
0 голосов
/ 28 августа 2018

Вы просто должны записать свои интервалы в списке только один раз.

intervals=[(0,9), (10,100)]
outside = []
for a,b in intervals:
    inside = []
    for col in df.columns[1:-1]:
        inside.append(df[col].between(a, b).sum())
    outside.append(inside)

new = []
for i, interval in enumerate(intervals):
    new.append(['-'.join(map(str,interval))] + outside[i] + [''])

new_df = pd.concat([df, pd.DataFrame(new, columns=df.columns)], axis=0, ignore_index=True)

  start position    A   b   rnd
0      149449305    4   99  88
1       47630133    6   50  10
2      128200594   12   7   600
3       49423101  100   10  8
4            0-9    2   1   
5         10-100    2   3   

и требуется,

5.14 ms ± 713 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
0 голосов
/ 28 августа 2018

Вы можете вычислить последние 2 строки как отдельный кадр данных, а затем объединить 2 кадра данных:

df1 = ...
df2 = pd.DataFrame()
df2['start position'] = ['0-9', '10-99']
df2['A'] = [df1['A'][df1['A'] >= 0][df1['A'] <= 9].count(), df1['A'][df1['A'] >= 10][df1['A'] <= 100].count()]
df2['B'] = [df1['B'][df1['B'] >= 0][df1['B'] <= 9].count(), df1['B'][df1['B'] >= 10][df1['B'] <= 100].count()]

result_df = pd.concat([df1, df2])[['start position','A','B','rnd']].reset_index()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...