Поскольку getOwnPropertyNames
может получить вам неперечислимые свойства, вы можете использовать это и объединить его с хождением по цепочке прототипов.
function getAllProperties(obj){
var allProps = []
, curr = obj
do{
var props = Object.getOwnPropertyNames(curr)
props.forEach(function(prop){
if (allProps.indexOf(prop) === -1)
allProps.push(prop)
})
}while(curr = Object.getPrototypeOf(curr))
return allProps
}
Я тестировал это на Safari 5.1 и получил
> getAllProperties([1,2,3])
["0", "1", "2", "length", "constructor", "push", "slice", "indexOf", "sort", "splice", "concat", "pop", "unshift", "shift", "join", "toString", "forEach", "reduceRight", "toLocaleString", "some", "map", "lastIndexOf", "reduce", "filter", "reverse", "every", "hasOwnProperty", "isPrototypeOf", "valueOf", "__defineGetter__", "__defineSetter__", "__lookupGetter__", "propertyIsEnumerable", "__lookupSetter__"]
Обновление: отредактировал код немного (добавленные пробелы и фигурные скобки и улучшил имя функции):
function getAllPropertyNames( obj ) {
var props = [];
do {
Object.getOwnPropertyNames( obj ).forEach(function ( prop ) {
if ( props.indexOf( prop ) === -1 ) {
props.push( prop );
}
});
} while ( obj = Object.getPrototypeOf( obj ) );
return props;
}
И просто получить все .. ( enum / nonenum, self / inherited .. Пожалуйста, подтвердите ..
function getAllPropertyNames( obj ) {
var props = [];
do {
props= props.concat(Object.getOwnPropertyNames( obj ));
} while ( obj = Object.getPrototypeOf( obj ) );
return props;
}
Вы можете использовать что-то вроде приведенного ниже кода для сопоставления / замены значений. Добавьте оператор if для обнаружения ячеек с несколькими значениями и разделите значения точкой с запятой:
for i in df_main['ID_1']:
df_main.loc[df_main['ID_1']==i , 'ID_1'] = df_1.loc[df_1['ID_1']==i , 'Monthly_MB']
Я предлагаю сначала создать словарь со всеми поисковыми файлами, используя DataFrame.set_index
и Series.to_dict
:
d = {'ID_1' : df2.set_index('ID_1')['Monthly_MB'].to_dict(),
'ID_2' : df3.set_index('ID_2')['platform'].to_dict(),
'ID_3' : df4.set_index('ID_3')['Device'].to_dict()}
, затем цикл по всем ключам словарей использовать понимание списка - сначала разбить значения на ;
, если строки, отобразить по словарю и join
обратно на ;
:
for c in d.keys():
f = lambda x: ';'.join(str(d[c].get(y, '')) for y in x.split(';'))
if isinstance(x, str)
else x
df1[c] = df1[c].apply(f)
print (df1)
Name Address ID_1 ID_2 ID_3
0 Ruth D. Batie 4962 Hill Street 1557 NaN BOOST2
1 Kelley C. Rice 1074 Tipple Road NaN android NaN
2 Gary P. Kirby 1520 Robinson Court 24 android;ios BOOST2