Работа с питонами пандами 0.19.

Я хочу создать новый фрейм данных (df2) как подмножество существующего фрейма данных (df1). df1 выглядит так:

In [1]: df1.head()
Out [1]:
    col1_name    col2_name    col3_name
0          23           42           55
1          27           55           57
2          52           20           52
3          99           18           53   
4          65           32           51

Логика такова:

df2 = []

for i in range(0,N):
    loc = some complicated logic
    df1_sub = df1.ix[loc,]
    df2.append(df1_sub)

df2 = pd.DataFrame.from_records(df2)

Результат df2 действительно является фреймом данных, но все содержимое состоит из имен столбцов df1. Это выглядит так:

In [2]: df2.head()
Out [2]:
    col1_name    col2_name    col3_name
0   col1_name    col2_name    col3_name
1   col1_name    col2_name    col3_name
2   col1_name    col2_name    col3_name
3   col1_name    col2_name    col3_name
4   col1_name    col2_name    col3_name

Я знаю, что это, вероятно, связано с преобразованием из списка в dataframe, но я не уверен, что именно мне здесь не хватает. Или есть лучший способ сделать это?

0
Jingwei Yu 6 Янв 2017 в 17:35

3 ответа

Лучший ответ

Согласно Теду Петру, решение просто:

pd.concat(df2)

Я был смущен типом данных df2.

Невозможно, учитывая логику внутри цикла for, напрямую выбирать df1, используя некоторый индекс.

1
Ledger Yu 6 Янв 2017 в 14:52

Вы можете воспользоваться масками панд (на самом деле, numpy).

import pandas as pd

df1 = pd.DataFrame({'a': [1, 2, 3, 4, 5], 'b': ['a', 'b', 'c', 'd', 'e'],
                    'c': [10, 11, 12, 13, 14]})

#      a  b   c
#   0  1  a  10
#   1  2  b  11
#   2  3  c  12
#   3  4  d  13
#   4  5  e  14

Предположим, что df2 должен быть подмножеством df1: он должен иметь столбцы b и c и только те строки, где столбец a имеет четное значение:

df2 = df1[df1['a'] % 2 == 0][['b', 'c']]
#    b   c
# 1  b  11
# 3  d  13
0
DeepSpace 6 Янв 2017 в 14:47

Как насчет просто нарезать кадр данных?

import pandas as pd
DF1 = pd.DataFrame()
DF1['x'] = ['a','b','c','a','c','b']
DF1['y'] = [1,3,2,-1,-2,-3]

DF2 = DF1[[(x == 'a' and y > 0) for x,y in zip(DF1['x'], DF1['y'])]]

Это должно быть намного эффективнее, чем добавление. DF1 [Complicated Condition] принимает любой логический аргумент

0
Oxymoron88 6 Янв 2017 в 14:44