如何指定列的范围,而不是在Python中逐个输入?

2024-09-24 06:34:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下CSV格式的数据表:

    Dilution    Lotus1  Lotus2  Lotus3  Lotus5  Lotus6a Lotus6c Lotus7  Lotus8
0   1.301030    0.7769  0.1884  0.3076  0.3066  1.5722  2.1263  0.3414  1.3695
1   1.778151    0.3767  0.2567  0.1872  0.1902  1.1285  1.9726  0.2267  0.7549
2   2.301030    0.2267  0.2049  0.1454  0.1483  0.6637  1.7816  0.1720  0.4223
3   2.778151    0.1519  0.1507  0.1194  0.1174  0.3244  1.4958  0.1452  0.2062
4   3.301030    0.1234  0.1256  0.1270  0.1440  0.2273  1.3553  0.1383  0.1705
5   3.778151    0.1151  0.1190  0.1166  0.1143  0.1402  0.7333  0.1218  0.1295
6   4.301030    0.1213  0.1219  0.1201  0.1209  0.1335  0.4217  0.1241  0.1279
7   4.778151    0.1145  0.1181  0.1144  0.1196  0.1205  0.2609  0.1259  0.1219

我使用trapz(x,y)函数计算了8个Lotus样本中每个样本的曲线下面积(AUC):

from numpy import trapz

x = (elisa.Lotus1, elisa.Lotus2, elisa.Lotus3, elisa.Lotus5, elisa.Lotus6a, elisa.Lotus6c, elisa.Lotus7, elisa.Lotus8)
y = (elisa.Dilution)

AUC = trapz(x,y)

[0.77020294 0.56251883 0.50852258 0.51922454 1.71261157 4.44964193
 0.57552938 1.26143932]

现在,由于我是python初学者,我在这里所做的是手动输入x轴所有列的名称,所以我的问题是:告诉python将相同的函数批量应用于一系列列(如列2-9或Lotus1-Lotus8)的语法是什么?我在绘图时也遇到同样的问题,因为我使用了以下代码:

import matplotlib.pyplot as plt
plt.style.use('ggplot')

x = ('elisa.Lotus1', 'elisa.Lotus2', 'elisa.Lotus3', 'elisa.Lotus5', 'elisa.Lotus6a', 'elisa.Lotus6c', 'elisa.Lotus7', 'elisa.Lotus8')
y = (0.77020294, 0.56251883, 0.50852258, 0.51922454, 1.71261157, 4.44964193, 0.57552938, 1.26143932)

我已经浏览了网页,但还没有找到专门帮助我解决这个问题的资源,而且我有数百个专栏要处理,所以这段代码非常方便

有人知道怎么做吗


Tags: 函数import样本elisaauctrapzlotus2lotus1
2条回答

有很多方法可以做到这一点,但它需要一个列表

第一种方法:使用df.columns。这将返回一个列表,其中包含您可以切片或使用的所有列名,就像您经常使用列表一样

第二种方法:使用list(df)。与之前类似,这将返回一个列表,其中包含dataframe中所有列的名称

第三种方法:列表理解:[x代表df中的x]返回一个包含df中所有列名称的列表,作为交换,这更灵活,允许过滤。例如,在您的案例中,如果希望保留以Lotus开头的列,可以执行以下操作:

[x for x in df if x.startswith('Lotus')]

最后,考虑到您似乎正在尝试将数据集拆分为包含Lotus和目标列Dilution的列,您可以使用pandas.drop()函数:

X = elisa.drop(columns='Dilution') #Returns the dataframe without the specific column
y = elisa['Dilution'] #Returns a series

对于前三种情况,您可以简单地将列表传递给数据帧、过滤列或使用loc

例如:

lotus_columns = [x for x in df if x.startswith('Lotus')]
lotus_df = df[lotus_columns]

另一个使用df.columns+切片的示例:

X = df[df.columns[1:]] #df.columns[1:] returns all columns except the first one

尝试添加axis = 0

np.trapz(elisa.loc[:,'Lotus1':],elisa.Dilution,axis=0)
array([0.77020283, 0.56251879, 0.50852253, 0.51922449, 1.71261136,
       4.44964163, 0.57552932, 1.26143913])

相关问题 更多 >