2017-11-16 1 views
0

ich einen Datenrahmen aus der folgenden Wörterbuch an Konstruktion:Datenrahmen gelten mit vektorisiert Funktion verhalten weirdly

diction = {"a":{"aa":0, "bb":2, "cc":3}, "b":{"aa":4, "bb":5, "cc":6}, "c":{"aa":7, "bb":8, "cc":9}} 
df = pandas.DataFrame(diction) 

Ich versuche dann einige Operationen auf dem Datenrahmen auszuführen, indem Sie die folgenden Funktionen:

import pandas 
import numpy as np 
import math 


def applyGivenTotals(rowOrColumn, rowOrColumnTotals, rowOrColumnName): 
    return rowOrColumn/float(rowOrColumnTotals[rowOrColumnName]) 

def piLogpi(value): 
    if(value==0): 
    return 0 
    else: 
    return -value * math.log10(value) 

def someFunction(df): 
    entropy = {} 
    rowTotals = df.sum(axis=1) 
    rowApplied = df.apply(lambda row:applyGivenTotals(row, rowTotals, row.name), axis=1) 
    unSummedPis = rowApplied.apply(np.vectorize(piLogpi)) 
    return unSummedPis 

Ich bekomme Nullen in der linken Spalte, aber ich verstehe nicht warum.

Um zu klären, mein erwartetes Ergebnis ist:

a   b   c 
aa 0   0.159757 0.124915 
bb 0.116675 0.159040 0.145601 
cc 0.129692 0.159040 0.150515 

Aber ich bin immer:

a   b   c 
aa 0 0.159757 0.124915 
bb 0 0.159040 0.145601 
cc 0 0.159040 0.150515 

Antwort

2

Ich glaube, Sie brauchen applymap für element Prozess:

def someFunction(df): 
    entropy = {} 
    rowTotals = df.sum(axis=1) 
    rowApplied = df.apply(lambda row:applyGivenTotals(row, rowTotals, row.name), axis=1) 
    unSummedPis = rowApplied.applymap(np.vectorize(piLogpi)) 
    return unSummedPis 

print (someFunction(df)) 

      a   b   c 
aa 0.000000 0.159757 0.124915 
bb 0.116675 0.159040 0.145601 
cc 0.129692 0.159040 0.150515 
+0

Danke, sieht aus wie Ich habe apply und applymap synonym verwendet, obwohl apply für Serienobjekte verwendet werden soll zur Dokumentation: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.apply.html. –

+0

@Aurgho Bhattacharjee - Ja, genau. – jezrael

Verwandte Themen