Вот еще один случай, когда сырые типы вас укусят:
public class StrangeClass<T> {
@SuppressWarnings("unchecked")
public <X> X getSomethingElse() {
return (X)"Testing something else!";
}
public static void main(String[] args) {
final StrangeClass<Object> withGeneric = new StrangeClass<>();
final StrangeClass withoutGeneric = new StrangeClass();
final String value1,
value2;
// Works
value1 = withGeneric.getSomethingElse();
// Produces compile error:
// incompatible types: java.lang.Object cannot be converted to java.lang.String
value2 = withoutGeneric.getSomethingElse();
}
}
Как уже упоминалось в принятом ответе, вы теряете всю поддержку дженериков в коде необработанного типа. Каждый параметр типа преобразуется в его стирание (которое в приведенном выше примере просто Object
).
Используя оператор &
, не забудьте обернуть подзапросы с помощью ()
:
males = df[(df[Gender]=='Male') & (df[Year]==2014)]
Чтобы сохранить ваши данные в файле dict
с помощью цикла for:
from collections import defaultdict
dic={}
for g in ['male', 'female']:
dic[g]=defaultdict(dict)
for y in [2013, 2014]:
dic[g][y]=df[(df[Gender]==g) & (df[Year]==y)] #store the DataFrames to a dict of dict
Демо для вашего getDF
:
def getDF(dic, gender, year):
return dic[gender][year]
print genDF(dic, 'male', 2014)
Для более общих логических функций, которые вы хотели бы использовать в качестве фильтра и которые зависят от более чем одного столбца, вы можете использовать:
df = df[df[['col_1','col_2']].apply(lambda x: f(*x), axis=1)]
, где f - это функция, применяемая к каждому пара элементов (x1, x2) из col_1 и col_2 и возвращает True или False в зависимости от любого условия, в котором вы хотите (x1, x2).
key
, как в вашемgetDF
? один параметр или кортеж ключей? быть конкретным plz;) – zhangxaochen 28 February 2014 в 07:21Gender
иYear
должны быть строками, т. Е.'Gender'
и'Year'
. – Steven C. Howell 4 May 2017 в 19:47