是否可以为给定的列选择5个特定范围内的值,并针对每个不同的数据框在新列中应用标签?
我的意思是,我有一个数据帧列表。所有数据框都有2列,并且共享相同的第一列,但第二列不同(标题和值)。例如:
>> df1
GeneID A
1 0.3
2 0.0
3 143
4 9
5 0.6
>> df2
GeneID B
1 0.2
2 0.3
3 0.1
4 0.7
5 0.4
....
我想:
对于列表中的每个数据帧,执行计算,得出该值出现在5个不同范围中的1个范围内的可能性。用这些值附加一个新列;
对于列表中的每个数据框,将相应的范围标签附加到另一个新列中。
范围是
*Range_Values* -> *Range_Label*
**[0]** -> 'l1'
**]0,1]** -> 'l2'
**]1,10]** -> 'l3'
**]10,100]** -> 'l4'
**>100** 'l5'
这2个步骤的方法会导致类似的情况:
>> list_dfs[df1]
GeneID A Prob_val Exp_prof
1 0.3 0.4 'l2'
2 0.0 0.2 'l1'
3 143 0.2 'l5'
4 9 0.2 'l3'
5 0.6 0.4 'l2'
答案 0 :(得分:1)
您必须首先定义垃圾箱和标签-
bins = [0, 1, 10, 100, float("inf")]
labels = ['l1', 'l2', 'l3', 'l4', 'l5']
然后使用pd.cut()
-
pd.cut(df1['A'], bins, right=False)
labels
中有一个pd.cut()
参数,可用于获取标签-
pd.cut(df1['A'], bins, labels=labels, right=False)
您可以使用生成的bins
来计算概率,我将其留给您来做。
您可以循环dfs
的其余部分执行此操作,最后将它们分配给列表-
list_dfs = [df1, df2, ...]
如果动态编号为dfs
,请使用循环-
框架
for df in dfs:
df['bins'] = pd.cut(df['A'], bins, right=False)
df['label'] = pd.cut(df['A'], bins, labels=labels, right=False)
答案 1 :(得分:1)
对于标签和垃圾桶,您可以使用pandas.cut
。请注意,您不能在此函数中将单例用作垃圾箱。因此,您之后必须创建它。这是您的操作方法。
首先,我重新创建一个数据框:
import io
temp = u"""
GeneID A
1 0.3
2 0.0
3 143
4 9
5 0.6"""
foo = pd.read_csv(io.StringIO(temp),delim_whitespace = True)
然后,我创建新列,并用标签NaN
填充l1
值,该标签对应于单例[0]
。
foo['Exp_prof'] = pd.cut(foo.A,bins = [0,1,10,100,np.inf],labels = ['l2','l3','l4','l5'])
foo['Exp_prof'] = foo['Exp_prof'].cat.add_categories(['l1'])
foo['Exp_prof'] = foo['Exp_prof'].fillna('l1')
然后我使用这一新列来计算概率:
foo['Prob_val'] = foo.Exp_prof.map((foo.Exp_prof.value_counts()/len(foo)).to_dict())
输出为:
GeneID A Exp_prof Prob_val
0 1 0.3 l2 0.4
1 2 0.0 l1 0.2
2 3 143.0 l5 0.2
3 4 9.0 l3 0.2
4 5 0.6 l2 0.4