私は4つのパンダデータフレームを持っています。最初の2つはカテゴリ値と数値dfです。
Cat_data = [
['Color', 'red', 0.2543],
['Color', 'orange',0.1894],
['Color', 'yellow',-0.2836],
['Fruit', 'orange', -1.3647],
['Fruit','banana',0.3648]
]
Cat_df = pd.DataFrame(Cat_data, columns = ['Variable', 'Cats', 'Value'])
Num_data = [
['Quantity', '-inf', '5', 0.2145],
['Quantity', '5', '10', 0.0268],
['Quantity', '10', 'inf', -0.5421],
['Rating', '-inf', '0.5', 0.6521],
['Rating','0.5', 'inf', -0.4378],
]
Num_df = pd.DataFrame(Num_data, columns = ['Variable', 'Inclusive', 'Exclusive', 'Value'])
Num_dataでは、「包括的」と「排他的」が値をチェックしています。
最初のレコードで言う> = -infおよび<5、
2番目のレコード値> = 5および<10でも同じで、値はActual_dfから取得されます
3番目のデータフレームは実際の値です
Actual_data = [
['yellow', 'banana', '4', '0.5']
]
Actual_df = pd.DataFrame(Actual_data, columns = ['Color', 'Fruit', 'Quantity', 'Rating'])
4番目は、Actual_dfと同じ列名を持つValueDataFrameです。
Value_df = pandas.DataFrame(numpy.zeros((1, 4)),
columns = ['Color', 'Fruit', 'Quantity', 'Rating'])
Value_dfにCat_dataの「Value」列とActual_dataのデータに対応する「Num_data」「Value」列を入力する必要があります。4つのdfをマージして値を取得し、それとともに「包括的」列と「排他的」列を確認する方法がわかりません。
実際のデータには、「黄色」、「バナナ」、「4」、「0.5」に対応する値があります。
黄色はCat_dfに-0.2836としてあります
バナナはCat_dfに0.3648としてあります
数量は0.2145としてNum_dfにあります
評価はNum_dfに-0.4378としてあります
Value_dfの結果DataFrameは次のようになります
Color Fruit Quantity Rating
-0.2836 0.3648 0.2145 -0.4378
Cat_dataについては、私は好きでした
Value_df['Color'] = Actual_df['Color'].map(Cat_df.set_index('Cats')['Value'])
色と果物の両方がオレンジ色の問題であり、どちらの値が取得されるかが問題であるため、変数も一致させる必要があり、次のようにエラーが発生します。
InvalidIndexError: Reindexing only valid with uniquely valued Index objects
範囲がNum_df
重複していないという事実に信頼できる場合は、次のようにこれを行うことができます。いくつかのヘルパー関数を定義していることに注意してください。それがなくても実行できますが、少し読みやすくなると思います。
# convert the datatypes (guess your real data does not store numeric values in strings)
Num_df[['Inclusive', 'Exclusive']]= Num_df[['Inclusive', 'Exclusive']].astype('float32')
Actual_df[['Quantity', 'Rating']]=Actual_df[['Quantity', 'Rating']].astype('float32')
# define two helper functions (or just store the categories / variables in different dataframes)
def get_variable_data(df, variable):
df= df.loc[df['Variable'] == variable, ['Cats', 'Value']].copy()
df.set_index(['Cats'], inplace=True)
df.columns= [variable + '_value']
return df
def get_num_data(df, variable):
df= df.loc[df['Variable'] == variable, ['Inclusive', 'Value']].copy()
df.sort_values(['Inclusive'], inplace=True)
df.columns=[variable + '_inclusive', variable + '_value']
# join the first part by a regular join
Joined_df= Actual_df
for cat in ['Color', 'Fruit']:
Joined_df= Joined_df.merge(get_variable_data(Cat_df, cat), left_on=[cat], right_index=True, how='left')
# now join according ranges using asof
for cat in ['Quantity', 'Rating']:
print(cat)
Joined_df= pd.merge_asof(Joined_df, get_num_data(Num_df, cat), left_on=[cat], right_on='Inclusive', direction='backward', suffixes=['', '_'+cat])
# drop the excess columns
Joined_df.drop([col for col in Joined_df if col.endswith('_inclusive')], axis='columns', inplace=True)
# the result of this is
Color Fruit Quantity Rating Color_value Fruit_value Quantity_value Rating_value
0 yellow banana 4.0 0.5 -0.2836 0.3648 0.2145 -0.4378
上で書いたように、最後のステップではmerge_asof
、範囲にギャップがなく、値がなく、値の範囲全体に及ぶことを前提としています。このため、範囲の終わりを確認する必要はありません。ただし、その仮定が正しくない場合は、コードを少し変更する必要があります。
そのまま使用merge_asof
し、変更するだけでget_num_data
、Exclusive
列も返されます。
Join_df.loc[Joined_df[cat]>=Joined_df[cat + '_exclusive'], cat]=defaultvalue
排他範囲を超える値を削除するために使用します。
ところで、この方法で行うのは本当に安全です。列の値が存在する行がある場合、利用可能な最大値、つまり、以下の値を検索するため、cat
によって選択されるmerge_asof
ためInclusive
です。の値col
(つまり、少なくとも重複する範囲がない場合ですが、例のように星座の場合はありそうにないようです)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加