2015-05-04 3 views
0

Я хочу подытожить все значения, которые я выбираю, исходя из некоторой функции столбца и строки.Pandas, выбрав по столбцу и строке

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

Есть ли простой способ сделать это?

ответ

2

Столбцы могут быть выбраны с использованием синтаксиса dataframe[<list of columns>]. Индекс (строка) может использоваться для фильтрации с использованием метода dataframe.index.

import pandas as pd 

df = pd.DataFrame({'a': [0.1, 0.2], 'b': [0.2, 0.1]}) 

odd_a = df['a'][df.index % 2 == 1] 
even_b = df['b'][df.index % 2 == 0] 
# odd_a: 
# 1 0.2 
# Name: a, dtype: float64 
# even_b: 
# 0 0.2 
# Name: b, dtype: float64 
+0

Я удалил пример, потому что он был недостаточно общим. –

+0

как вообще вы хотите это быть? и с каким интерфейсом вы хотите закончить? –

+0

Мне бы очень хотелось это сделать: (lambda x, y: x [4]

1

Если df Ваш dataframe:

In [477]: df 
Out[477]: 
    A s2 B 
0 1 5 5 
1 2 3 5 
2 4 5 5 

Вы можете получить доступ к нечетным строкам следующим образом:

In [478]: df.loc[1::2] 
Out[478]: 
    A s2 B 
1 2 3 5 

и даже те, как это:

In [479]: df.loc[::2] 
Out[479]: 
    A s2 B 
0 1 5 5 
2 4 5 5 

Чтобы ответить на ваш вопрос , Получая даже строки и столбца B бы:

In [480]: df.loc[::2,'B'] 
Out[480]: 
0 5 
2 5 
Name: B, dtype: int64 

и нечетные строки и столбца A можно сделать:

In [481]: df.loc[1::2,'A'] 
Out[481]: 
1 2 
Name: A, dtype: int64 
+0

Я удалил пример, потому что он был недостаточно общим. –

0

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

import numpy as np 
import pandas as pd 

ran = np.random.randint(0,10,size=(5,5)) 
df = pd.DataFrame(ran,columns = ["a","b","c","d","e"]) 

# A dictionary to define what function is passed 
d_col = {"high":["a","c","e"], "low":["b","d"]} 
d_row = {"high":[1,2,3], "low":[0,4]} 

# Generate list of Pandas boolean Series 
i_col = [df[i].apply(lambda x: x>5) if i in d_col["high"] else df[i].apply(lambda x: x<5) for i in df.columns] 

# Pass the series as a matrix 
df = df[pd.concat(i_col,axis=1)] 

# Now do this again for rows 
i_row = [df.T[i].apply(lambda x: x>5) if i in d_row["high"] else df.T[i].apply(lambda x: x<5) for i in df.T.columns] 

# Return back the DataFrame in original shape 
df = df.T[pd.concat(i_row,axis=1)].T 

# Perform the final operation such as sum on the returned DataFrame 
print(df.sum().sum()) 
Смежные вопросы