2017-01-06 1 views
0

Работа с python pandas 0.19.Python - запуск пустого информационного фрейма и заполнение из другого фрейма данных

Я хочу создать новый dataframe (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 действительно dataframe, но содержание все состоит из имен столбцов 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

включите 'df1.head()' и конечный результат, который вы хотите. Это затрудняет понимание проблемы. – MYGz

+1

Я не уверен точно, что вы просите, но есть много вещей, которые необходимо решить. Не используйте '.ix', если это абсолютно необходимо. Вам не нужно создавать список данных для этого, но если вы это сделаете, последняя строка должна быть изменена на 'pd.concat (df2)'. Пожалуйста, предоставьте больше информации, так как может быть возможно не использовать цикл for для построения логики. Кроме того, имя 'df2' означает, что у вас есть DataFrame. Вместо этого используйте что-то вроде 'df_list'. –

+0

в цикле for проверяет значение loc, он может сказать вам, что что-то не так – Shijo

ответ

1

Согласно Ted Petrou, то решение просто:

pd.concat(df2) 

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

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

0

Как насчет только фрагмента данных?

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 [Сложное состояние] принимает любые логические аргументы

0

Вы можете использовать маскированные массивы pandas '(на самом деле numpy's).

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 
Смежные вопросы