तो मेरे पास यह नमूना डेटाफ्रेम है:

      x_mean    x_min    x_max     y_mean     y_min     y_max
 1      85.6        3      264       75.7         3       240
 2     105.5        6      243       76.4         3       191
 3      95.8       19      287       48.4         8       134
 4      85.5       50      166       64.8        32       103
 5      55.9       24      117       46.7        19        77 


x_range = [list(range(0,50)),list(range(51,100)),list(range(101,250)),list(range(251,350)),list(range(351,430)),list(range(431,1000))]
y_range = [list(range(0,30)),list(range(31,60)),list(range(61,90)),list(range(91,120)),list(range(121,250)),list(range(251,2000))]


#here x = Any column with mean value (eg. x_mean or y_mean)
# y = x_range / y_range 

def min_max_range(x,y):
for a in y:
    if int(x) in a:
        min_val = min(a)
        max_val = max(a)+1
        return max_val - min_val

def min_range(x,y):
for a in y:
    if int(x) in a:
        min_val = min(a)
        return min_val

अब मैं नए कॉलम प्राप्त करने के लिए इन फ़ंक्शन min_max_range() और min_range() को कॉलम x_mean, y_mean पर लागू करना चाहता हूं।

जैसे फ़ंक्शन min_max_val कॉलम x_mean और रेंज x_range का उपयोग कॉलम x_min_max_val बनाने के लिए इनपुट के रूप में कर रहा है, इसी तरह कॉलम y_mean और रेंज y_range कॉलम y_min_max_val के लिए उपयोग किया जाता है:

मैं इन एक लाइनर का उपयोग करके प्रत्येक कॉलम को एक-एक करके बना सकता हूं, लेकिन मैं इसे एक लाइनर के साथ एक बार में दोनों कॉलम x_mean & y_mean कॉलम पर लागू करना चाहता हूं।

df['x_min_max_val'] = df['x_mean'].apply(lambda x: min_max_range(x,x_range))
df['y_min_max_val'] = df['y_mean'].apply(lambda x: min_max_range(x,y_range))  

परिणामी डेटाफ्रेम इस तरह दिखना चाहिए:

      x_mean    x_min    x_max     y_mean     y_min     y_max    x_min_max_val   y_min_max_val        x_min_val   y_min_val
1      85.6        3      264       75.7         3       240                49              29               51          61
2     105.5        6      243       76.4         3       191               149              29              101          91
3      95.8       19      287       48.4         8       134                49              29               51          91
4      85.5       50      166       64.8        32       103                49              29               51          61
5      55.9       24      117       46.7        19        77                49              29               51          31

मैं एक बार में एक कॉलम बनाने के बजाय इन कॉलमों को एक बार में बनाना चाहता हूं। मैं यह कैसे कर सकता हूँ? कोई सुझाव? या ऐसा कुछ काम कर सकता है?

df.filter(regex='mean').apply(lambda x: min_max_range(x,x+'_range'))
1
astroluv 12 जिंदा 2020, 03:25

1 उत्तर

सबसे बढ़िया उत्तर

यह वह अवधारणा है जिसे ऐसा करने के लिए आपको अनुसरण करने की आवश्यकता है। नामों के माध्यम से उन तक पहुंच को सक्षम करने के लिए पहले आपको अपनी श्रेणियों को एक शब्दकोश में संग्रहीत करने की आवश्यकता है।

range_dict = {}
range_dict['x_range'] = x_range
range_dict['y_range'] = y_range

साथ ही, आपको उन स्तंभों की आवश्यकता है जिनकी आपको सूची में गणना करने की आवश्यकता है (या यदि उनके पास एक विशिष्ट पैटर्न है तो आप उन्हें प्राप्त करने के लिए रेगेक्स का उपयोग कर सकते हैं)

mean_cols_list = ['x_mean', 'y_mean']

अब, अपने फ़ंक्शन को सभी स्तंभों पर लागू करने के लिए, आपको इस तरह के फ़ंक्शन को परिभाषित करने की आवश्यकता है

def min_max_calculator(df, range_dictionary, mean_columns_list):
    for i in range(len(mean_cols_list)):
        # this returns 'x_mean'
        current_column = mean_cols_list[i]
        # this returns 'x_min_max_value'
        output_col_name = current_column.replace('mean','min_max_value')
        # this returns 'x_range'
        range_name = current_column.replace('mean','range')
        # this returns the list of ranges for x_range
        range_list = range_dict[range_name]
        # This add the calculated column to the dataframe
        df[output_col_name] = df[current_column].apply(lambda x: min_max_range(x,range_list))
    return(df)

df_output = min_max_calculator(df, range_dict, mean_cols_list)
1
BICube 12 जिंदा 2020, 05:21