Найти корреспондентов в фреймах данных для расчета

Я знаю, что этот вопрос слишком стар, но я не видел никакой реализации, подобной моей. Эта версия основана на символе преобразования Шварца .

function sortByAttribute(array, ...attrs) {
  // generate an array of predicate-objects contains
  // property getter, and descending indicator
  let predicates = attrs.map(pred => {
    let descending = pred.charAt(0) === '-' ? -1 : 1;
    pred = pred.replace(/^-/, '');
    return {
      getter: o => o[pred],
      descend: descending
    };
  });
  // schwartzian transform idiom implementation. aka: "decorate-sort-undecorate"
  return array.map(item => {
    return {
      src: item,
      compareValues: predicates.map(predicate => predicate.getter(item))
    };
  })
  .sort((o1, o2) => {
    let i = -1, result = 0;
    while (++i < predicates.length) {
      if (o1.compareValues[i] < o2.compareValues[i]) result = -1;
      if (o1.compareValues[i] > o2.compareValues[i]) result = 1;
      if (result *= predicates[i].descend) break;
    }
    return result;
  })
  .map(item => item.src);
}

Вот пример того, как его использовать:

let games = [
  { name: 'Pako',              rating: 4.21 },
  { name: 'Hill Climb Racing', rating: 3.88 },
  { name: 'Angry Birds Space', rating: 3.88 },
  { name: 'Badland',           rating: 4.33 }
];

// sort by one attribute
console.log(sortByAttribute(games, 'name'));
// sort by mupltiple attributes
console.log(sortByAttribute(games, '-rating', 'name'));

1
задан Mark K 16 January 2019 в 06:08
поделиться

2 ответа

Используйте map для добавления нового столбца, удалите 0 строк с помощью boolean indexing и в последний раз примените свое решение в том же фрейме данных:

df_wt['Score'] = df_wt['Name'].map(df_sc.set_index('Name')['Score'])

df_wt = df_wt[df_wt['Weight'].ne(0)]
print (df_wt)
        Name  Weight  Score
0    Abigail      10    360
2      Aiden      12    345
3     Amelia      20    601
4       Aria      25    604
5        Ava      10    313
7  Charlotte      18    531
8      Chloe      16    507
9     Elijah      13    473

print (df_wt.Weight.corr(df_wt.Score))
0.923425144491911
0
ответ дан jezrael 16 January 2019 в 06:08
поделиться

Маскирование и получение ненулевых значений и общего индекса:

df_wt.set_index('Name', inplace=True)
df_sc.set_index('Name', inplace=True)

mask = df_wt['Weight'].ne(0)
common_index = df_wt.loc[mask, :].index
df_wt.loc[common_index, 'Weight'].corr(df_sc.loc[common_index, 'Score'])

0.923425144491911

Если оба кадра данных содержат нули, то:

mask1 = df_wt['Weight'].ne(0)
mask2 = df_sc['Score'].ne(0)
common_index = df_wt.loc[mask1, :].index.intersection(df_sc.loc[mask2, :].index)
df_wt.loc[common_index, 'Weight'].corr(df_sc.loc[common_index, 'Score'])
0
ответ дан Sandeep Kadapa 16 January 2019 в 06:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: