我有一个科学家数据框
radius date spin atom
0 12,50 YYYY/MM 0 he
1 11,23 YYYY/MM 2 c
2 45,2 YYYY/MM 1 z
3 11,1 YYYY/MM 1 p
我想为每行选择半径小于等于5的所有行,例如5
我已经定义了一个要计算的函数(简单,这是一个例子):
def diff_radius (a,b)
return a-b
是否可以为每行找到一些检查外部函数调用条件的行?
我尝试某种方式,但不起作用:
for i in range(df.shape[0]):
....
df_in_radius=df.apply(lambda x : diff_radius(df[i]['radius'],x['radius']))
你能帮我吗?
答案 0 :(得分:1)
我假设radius
列的数据类型是tuple
。您可以像这样保留diff_radius
方法
def diff_radius(x):
a, b = x
return a-b
然后,您可以在熊猫中使用loc
方法来选择与半径差小于5的条件匹配的行。
df.loc[df.radius.apply(diff_radius) < 5]
编辑#1
如果radius
列的数据类型是string
,则将其拆分并进行类型转换。逻辑将采用diff_radius
方法。如果是string
def diff_radius(x):
x_split = x.split(',')
a,b = int(x_split[0]), int(x_split[-1])
return a-b
答案 1 :(得分:0)
我打错了。
我的数据框是:
radius of my atom date spin atom
0 12.50 YYYY/MM 0 he
1 11.23 YYYY/MM 2 c
2 45.2 YYYY/MM 1 z
3 11.1 YYYY/MM 1 p
我做一个循环,在一行上应用其响应条件的每一行的特殊计算。 示例:
def diff_radius(current_row,x):
current_row['radius']-x['radius']
return a-b
df=pd.read_csv(csvfile,delimiter=";",names=('radius','date','spin','atom'))
# for each row of original dataframe
for i in range(df.shape[0]):
# first build a new and tmp dataframe with row
# which have a radius less 5 than df.iloc[i]['radius] (level of loop)
df_tmp=df[diff_radius(df.iloc[i]['radius],df['radius']) <5]
....
# start of special calc, with the df_tmp which contains all of rows
# less 5 than the current row **(i)**
衷心感谢您的回答