Pandasのexec()はNANを返します -- python フィールド と pandas フィールド と dataframe フィールド と exec フィールド と nan フィールド 関連 問題

Exec() in pandas returns NaNs












2
vote

問題

日本語

私は私の符号化量を減らすための関数を作成しようとしています。この関数は、PandasデータフレームでEXEC()を使用していくつかの計算を行います。しかし、私がexec()内にコードを置くとNANを返します。これが機能です:

<事前> <コード> def FeatureMaker(data, criteria_col, f_data): source = data.copy() for key, value in f_data.items(): for i in source[criteria_col].unique(): source.set_value(source[source[criteria_col] == i].index.tolist(), key, exec('source[source[criteria_col] == i]["' + value[0] + '"].' + value[1] + '()')) return source

関数はデータフレームを取得することになっています、基準を保持している列(この場合は 'ID'列)として渡された列の固有項目を見つけて、それに渡されたものを計算します。この関数では、引数 data はデータフレームを保持し、 criteria_col は基準の値を持つ列の名前を保持し、 f_data は鍵が新しい列の名前とその値の計算を実行しなければならない列と計算自体の名前である辞書。これは、関数を実行する方法の例です。

<事前> <コード> FeatureMaker(spend_alpha, 'id', {'total_sum': ["spend", "sum"]})

この例では、 spisw_alpha は私のデータフレームの名前です、 id は私の基準列です。 total_sum を作成したいです。 SPERM 列の sum>を計算することによって列。

機能は完全に実行されます。ただし、NAN以外何も返しません。以下のコードを試しました。 <事前> <コード> for i in spend_alpha['id'].unique(): spend_alpha.set_value(spend_alpha[spend_alpha['id'] == i].index.tolist(), 'total_sum', spend_alpha[spend_alpha['id'] == i]['spend'].sum())

とそれは問題なく機能します。各IDの合計合計を取得します。ただし、このコードはNANを返します。

<事前> <コード> for i in spend_alpha['id'].unique(): spend_alpha.set_value(spend_alpha[spend_alpha['id'] == i].index.tolist(), 'total_sum', exec("spend_alpha[spend_alpha['id'] == i]['spend'].sum()"))

私の質問は、NANを取得せずにPandasデータフレームでEXEC()を使用する方法をどうすればよいですか。事前にありがとうございました。

編集:

再現可能な例: 次のように supp_alpha データフレームを作成しましょう... <事前> <コード> In [1]: import pandas as pd In [2]: spend_alpha = pd.DataFrame([[100, 250], ...: [101, 50], ...: [102, 60], ...: [100, 50], ...: [102, 30], ...: [101, 50]], columns=['id', 'spend']) In [3]: spend_alpha Out[3]: id spend 0 100 250 1 101 50 2 102 60 3 100 50 4 102 30 5 101 50

以下のコードを実行して、 total_sum という新しい列を追加できます...

<事前> <コード> In [4]: for i in spend_alpha['id'].unique(): ...: spend_alpha.set_value(spend_alpha[spend_alpha['id'] == i].index.tolist(), 'total_sum', spend_alpha[spend_alpha['id'] == i]['spend'].sum()) ...: In [5]: spend_alpha Out[5]: id spend total_sum 0 100 250 300.0 1 101 50 100.0 2 102 60 90.0 3 100 50 300.0 4 102 30 90.0 5 101 50 100.0

しかし、set_value()関数の3番目の引数をexec()内部に配置すると、NANを返します。下記のように:

<事前> <コード> In [6]: for i in spend_alpha['id'].unique(): ...: spend_alpha.set_value(spend_alpha[spend_alpha['id'] == i].index.tolist(), 'total_sum', exec("spend_alpha[spend_alpha['id'] == i]['spend'].sum()")) ...: In [7]: spend_alpha Out[7]: id spend total_sum 0 100 250 NaN 1 101 50 NaN 2 102 60 NaN 3 100 50 NaN 4 102 30 NaN 5 101 50 NaN

関数内の行を使用できるように、3番目の引数をexec()内に配置できるようにしたいです。このようにして、その関数に渡すことによってSum()以外の他の集計を計算できます。しかし、exec()はNANを返すことはできません。

同様に、関数は列 sups の列を計算しなければなりません。 spusp_alpha データフレームからID で、 total_sum という列に保存します。しかし、それはNANを返します。 <事前> <コード> In [8]: def FeatureMaker(data, criteria_col, f_data): ...: source = data.copy() ...: for key, value in f_data.items(): ...: for i in source[criteria_col].unique(): ...: source.set_value(source[source[criteria_col] == i].index.tolist(), key, exec('source[source[criteria_col] == i]["' + value[0] + '"].' + value[1] + '()')) ...: return source In [9]: FeatureMaker(spend_alpha, 'id', {'total_sum': ["spend", "sum"]}) Out[9]: id spend total_sum 0 100 250 NaN 1 101 50 NaN 2 102 60 NaN 3 100 50 NaN 4 102 30 NaN 5 101 50 NaN

誰かがこの問題を克服するのを助けることができるならば、私は本当に感謝しています。

英語

I am trying to create a function to decrease the amount of my coding. The function uses exec() on a Pandas data frame to do some calculations. But when I put the code inside exec() it returns NaNs. Here is the function:

def FeatureMaker(data, criteria_col, f_data):     source = data.copy()     for key, value in f_data.items():         for i in source[criteria_col].unique():             source.set_value(source[source[criteria_col] == i].index.tolist(), key, exec('source[source[criteria_col] == i]["' + value[0] + '"].' + value[1] + '()'))     return source 

The function is supposed to get a data frame, find the unique items of a column which has been passed as the column holding the criteria (in this case the 'id' column), and calculate what has been passed to it. In this function, argument data holds the data frame, criteria_col holds the name of a column which has the values of the criteria, and f_data is a dictionary whose keys are the names of the new columns and its values the column on which the calculation has to be performed and the calculation itself.This is an example of how I run the function:

FeatureMaker(spend_alpha, 'id', {'total_sum': ["spend", "sum"]}) 

In this example, spend_alpha is the name of my data frame, id is my criteria column, and I want to create the total_sum column by calculating the sum of the spend column.

The function runs perfectly. However, it returns nothing but NaNs. I tried the code below:
for i in spend_alpha['id'].unique():     spend_alpha.set_value(spend_alpha[spend_alpha['id'] == i].index.tolist(), 'total_sum', spend_alpha[spend_alpha['id'] == i]['spend'].sum()) 

And it works without a problem. I get the total sum of each id. However, this code returns NaNs as well:

for i in spend_alpha['id'].unique():     spend_alpha.set_value(spend_alpha[spend_alpha['id'] == i].index.tolist(), 'total_sum', exec("spend_alpha[spend_alpha['id'] == i]['spend'].sum()")) 

My question is, how can I use exec() on a Pandas data frame without getting NaNs? Thank you in advance.

Edit:

Reproducible example: Lets say I create the spend_alpha data frame as follows...
In [1]: import pandas as pd  In [2]: spend_alpha = pd.DataFrame([[100, 250],    ...:                             [101, 50],    ...:                             [102, 60],    ...:                             [100, 50],    ...:                             [102, 30],    ...:                             [101, 50]], columns=['id', 'spend'])  In [3]: spend_alpha Out[3]:     id  spend 0  100    250 1  101     50 2  102     60 3  100     50 4  102     30 5  101     50 

I can add a new column called total_sum by running the code below...

In [4]: for i in spend_alpha['id'].unique():    ...:     spend_alpha.set_value(spend_alpha[spend_alpha['id'] == i].index.tolist(), 'total_sum', spend_alpha[spend_alpha['id'] == i]['spend'].sum())    ...:  In [5]: spend_alpha Out[5]:     id  spend  total_sum 0  100    250      300.0 1  101     50      100.0 2  102     60       90.0 3  100     50      300.0 4  102     30       90.0 5  101     50      100.0 

However, if I place the third argument of the set_value() function inside exec() it well return NaNs. As shown below:

In [6]: for i in spend_alpha['id'].unique():    ...:     spend_alpha.set_value(spend_alpha[spend_alpha['id'] == i].index.tolist(), 'total_sum', exec("spend_alpha[spend_alpha['id'] == i]['spend'].sum()"))    ...:  In [7]: spend_alpha Out[7]:     id  spend  total_sum 0  100    250        NaN 1  101     50        NaN 2  102     60        NaN 3  100     50        NaN 4  102     30        NaN 5  101     50        NaN 

I want to be able to place the third argument inside exec() so that I can use the line within a function. This well let me calculate other aggregations other than sum() by passing it to the function. But it is not possible since exec() returns NaNs.

Likewise, the function has to calculate the sum of column spend per unique items of column id from the spend_alpha data frame and save it in a column called total_sum. But it returns NaNs.
In [8]: def FeatureMaker(data, criteria_col, f_data):    ...:     source = data.copy()    ...:     for key, value in f_data.items():    ...:         for i in source[criteria_col].unique():    ...:             source.set_value(source[source[criteria_col] == i].index.tolist(), key, exec('source[source[criteria_col] == i]["' + value[0] + '"].' + value[1] + '()'))    ...:     return source  In [9]: FeatureMaker(spend_alpha, 'id', {'total_sum': ["spend", "sum"]}) Out[9]:     id  spend  total_sum 0  100    250        NaN 1  101     50        NaN 2  102     60        NaN 3  100     50        NaN 4  102     30        NaN 5  101     50        NaN 

I would be really thankful if anyone can help me overcome this problem.

</div
              
         
         

回答リスト


関連する質問

13  C#のNULL可能な型への代替案  ( Alternatives to nullable types in c sharp ) 
私は一連の数値データで動作するアルゴリズムを書いています。時には、シリーズの値はnullになる必要があります。ただし、このアプリケーションはパフォーマンスが重要ですので、NULL可能な型の使用を回避しました。私はPERFがNullable Type vs非NU...

16  ScipyMinize Handle NaNをどのようにしていますか?  ( How does scipy minimize handle nans ) 
SCIPYMINIMIZEのSLSQPソルバーを使用して、制約付き最適化問題を解決しています。非常に頻繁にソルバーは制約に違反するパラメータ値を試みます。これらの制約が違反されると、目的関数は nan を返します。私の近似ヤコビアンは、再計算されるたびに n...

1  NaNを許可する低メモリDType  ( Low memory dtypes allowing nan ) 
データフレームの列に一連のintを保存する方法を識別しようとしています。 既知のように、少なくとも存在する場合には、少なくともシリーズに存在する場合、彼のDTypeは自動的にfloat 64に変更されます。私の場合、私はビッグテーブルを取り扱うので、これは問題...

0  Pandasでは、少なくとも1つのNANを含まないすべての列をデータフレームから削除することができますか。  ( In pandas how can all columns that do not contain at least one nan be dropped f ) 
私はいくつかの列に NaN 値があるデータフレームがあります。少なくとも1つの NaN 値を持たないすべての列をドロップします。 ブール値で埋められたデータフレームを作成することによって NaN 値を識別することができます( NaN 値、 True ) > F...

1  indexsliceを使用してPandasでマルチデテックスデータフレームをフィルタリングします  ( Using indexslice to filter multiindex dataframes with pandas ) 
質問:注射が0またはNaNに等しくなく、他の列の値を紛失しないように行をフィルタリングする方法は? 次のコードで作成されたデータフレームがあります。 <事前> <コード> import pandas as pd df=pd.DataFrame( ...

18  意図的にNaNを返します  ( Intentionally return nan ) 
私はRay Tracerを書いていて、プロセスの一部が光線を発射しているため、オブジェクト(幾何学オブジェクト)が発生する可能性があります。交差点が起こらなかった(交差点が想像している)が、交差点が起こらなかった場合はすべてのオブジェクトを返すわけではなく、オ...

2  列がすべてNANである場合、NANARGMINを返すNANを返す  ( Making numpy nanargmin return nan if column is all nan ) 
numpy.nanargmin を使用することは可能ですので、NANのみがある列に numpy.nan を返します。現在、それが起こると、<コード> 99887763 を上げます。そして、列に数字が少ない場合に失敗するので、 numpy.argmin を使...

284  IEEE754 NAN値にFALSEを返すすべての比較の根拠は何ですか?  ( What is the rationale for all comparisons returning false for ieee754 nan values ) 
Nan値の比較は他のすべての値とは異なる動作が異なるのですか? つまり、演算子とのすべての比較==、&lt; =、&gt; =、&gt; 1つまたは両方の値がNANの場合、他のすべての値の動作とは反対に、falseを返します。 私はこれが何らかの方法で数値計...

1  日付変換に文字列を返します  ( String to date conversion returns nan ) 
jQuery DateTime Pickerプラグインを使用していて、3つのTextBoxes Vizがあります。、StartDate、EndDate、違い。プラグインは完全に動作し、StartDate String(DD / MM / YYYY HH:MM...

7  ActionScript(nan == parsefloat(input.text))では、常にfalseになると警告しています。どうして?  ( In actionscript nan parsefloatinput text warns that it will always be false ) 
むしろclear Documentation htref = "http://livesocs.adobe.com/flash/9.0/actionscriptlangrefv3/package.html# parsefloat()" rel = "nor...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有