我们可以传递一列而不是变量来访问列表的第 n 项吗?

Posted

技术标签:

【中文标题】我们可以传递一列而不是变量来访问列表的第 n 项吗?【英文标题】:Can we pass a column instead of a variable to access nth item of a list? 【发布时间】:2021-07-21 19:01:16 【问题描述】:

我的数据包含多列,我在这些列上进行了分组,并根据分组给出了行号。我在这里使用 python “文本”列是字符串列表。整个“文本”最初是 1 个字符串,用 ; 拆分成一个列表。作为分隔符。行号是整数。 我在这里要做的是,将 Rownum 视为指向输出列的指针。 如果 Rownum=0,那么我的输出应该是 Text[0],即 a.

如果 Rownum = 2,输出应该是列表 Text 的第 2 项,Text1,即 b

为此,我尝试了:

df['Outpu'] = df.apply(lambda x:x['Text'].split(';'),axis = 1)[df['Row_num']]

但我收到错误“无法从重复轴重新索引”。 不完全确定这意味着什么。 我附上了我的数据和输出的图像,但也写下了格式以防图像不可用。希望我解释的情况足够清楚。 原文不是 a,b,c:放在那里便于理解。这是正文:

Text: [TAF KPHX 010246Z 0103/0206 VRB04KT P6SM FEW070 BKN160 ;FM010700 10005KT P6SM SCT060 BKN150 ;FM012100 21006KT P6SM SCT070 SCT140 ;FM020000 26005KT P6SM FEW070 SCT140]

Row num     Text          Output

0         [a,b,c,d]        a
1         [a,b,c,d]        b
2         [a,b,c,d]        c
3         [a,b,c,d]        d
0         [d,e,f]          d
1         [d,e,f]          e
2         [d,e,f]          f

【问题讨论】:

请不要链接到图片,编辑问题并将数据添加为文本。 【参考方案1】:

如我所见,分隔符应该是“,”而不是“;”。由于“Text”是单个字符串,因此首先删除方括号uisng replace(),然后将其拆分为“,”,然后使用“Row_num”中的索引提取元素

df =pd.DataFrame("Row_num": [0,1,2,3,0,1,2],"Text":['[a,b,c,d]', '[a,b,c,d]', '[a,b,c,d]', '[a,b,c,d]', '[d,e,f]', '[d,e,f]', '[d,e,f]'])
df["Output"] = df.apply(lambda x: x.Text.replace("[","").replace("]","").split(",")[x.Row_num], axis=1)
print(df)
    Row_num Text    Output
0   0   [a,b,c,d]   a
1   1   [a,b,c,d]   b
2   2   [a,b,c,d]   c
3   3   [a,b,c,d]   d
4   0   [d,e,f]     d
5   1   [d,e,f]     e
6   2   [d,e,f]     f

假设您在文本列中有“,”作为分隔符,然后尝试:

df =pd.DataFrame("Row_num": [0,1,2,3,4],"Text":["a;b;c;d;e"]*5)
df["Output"] = df.apply(lambda x: x.Text.split(";")[x.Row_num], axis=1)
print(df)
 Row_num    Text    Output
0   0   a;b;c;d;e   a
1   1   a;b;c;d;e   b
2   2   a;b;c;d;e   c
3   3   a;b;c;d;e   d
4   4   a;b;c;d;e   e

确保数据在提到的 Row_num 处的 Text 中可用

【讨论】:

这是文本的原始格式。我使用字母只是为了更容易理解。 TAF KPHX 010246Z 0103/0206 VRB04KT P6SM FEW070 BKN160 ;FM010700 10005KT P6SM SCT060 BKN150 ;FM012100 21006KT P6SM SCT070 SCT140 ;FM020000 26005KT40CTpans> 您提供的示例文本中有“,” 我明白,这是我的错误。应该使用 ;作为分隔符。你能帮我解决实际的文本部分吗?我通过稍微调整它尝试了您的数据解决方案,但收到错误“列表索引超出范围” 它应该给出错误,因为分隔符是“,”所以每次拆分只返回一个值。好吧,为您编辑了答案。请检查一下。

以上是关于我们可以传递一列而不是变量来访问列表的第 n 项吗?的主要内容,如果未能解决你的问题,请参考以下文章

阿帕奇火花。 UDF 列基于另一列而不将其名称作为参数传递。

检索一列而不是另一列的不同 SQL 查询结果

Python - csv writer 按列而不是按行写入

如何重命名 df 列而不将列列表临时存储到变量中?

如何根据选定的列而不是Oracle中表的所有列获取不同的行

如何在 QueryExpression::addCase() 中使用表列而不是变量