使用作为字符串一部分的整数迭代 for 循环
Posted
技术标签:
【中文标题】使用作为字符串一部分的整数迭代 for 循环【英文标题】:Iterate a for loop with an integer which is a part of a string 【发布时间】:2018-09-11 12:05:59 【问题描述】:我有一个带有 Time[s]、Time[s].1、Time[s].2 等轴直到 Time[s].30 的 pandas 数据框。我想找出具有最大分辨率的列。为此,我认为我需要将所有这些都放在一个 for 循环中。由于名称'Time[s].x'是一个字符串,我不知道如何将它从0迭代到30。
for i in df['Time[s]."Something to write here"]:
示例输入数据框:(列直到 Time[s].30)
Time[s] v1 Time[s].1 v2
160.84621 0 160.84808 7
161.14613 0 161.14802 7
样本输出:'Time[s]'
因为间隔即(df['Time[s]'][1] - df['Time[s]][0])
小于
(df['Time[s].1'][1] - df['Time[s].1][0])
。
我需要检查所有 30 列。
【问题讨论】:
请发布一些示例输入和预期输出 @VivekKalyanarangan 请在那里找到输入和所需的输出。 @tworitdash - 你认为列名的差异最大吗? @jezrael 是的,我需要最小差异。 【参考方案1】:我认为需要:
print (df)
Time[s] v1 Time[s].1 v2 Time[s].2 v3 Time[s].3 v4
0 160.84621 0 160.84808 7 168.84621 0 162.84808 7
1 161.14613 0 161.14802 7 170.14613 0 164.14802 7
2 163.12613 0 161.14852 7 170.64613 0 Disable this function 7
3 165.16613 0 161.14892 7 170.24613 0 160.14802 7
df1 = df.filter(like='Time').apply(lambda x: pd.to_numeric(x, errors='coerce')).diff()
print (df1)
Time[s] Time[s].1 Time[s].2 Time[s].3
0 NaN NaN NaN NaN
1 0.29992 0.29994 1.29992 1.29994
2 1.98000 0.00050 0.50000 NaN
3 2.04000 0.00040 -0.40000 NaN
s = df1.idxmin(axis=1)
print (s)
0 NaN
1 Time[s]
2 Time[s].1
3 Time[s].2
dtype: object
解释:
-
首先通过
DataFrame.filter
过滤所有带有Time
的列
每列转换to_numeric
,参数errors='coerce'
表示将非数字转换为NaN
s
通过DataFrame.diff
获取差异
最后通过DataFrame.idxmin
按每行最小值获取列名
【讨论】:
我在 "df = df.filter(like='Time').diff()
" 这一行遇到了数据类型错误。错误:unsupported operand type(s) for -: 'str' and 'str'
@tworitdash - df.filter(like='Time').astype(float).diff()
工作如何?
现在有这个了。 ValueError: could not convert string to float: 'Disable this function'
@tworitdash - 这意味着数字之间有字符串值Disable this function
,我编辑答案以将这些值替换为NaN
s
没错!谢谢以上是关于使用作为字符串一部分的整数迭代 for 循环的主要内容,如果未能解决你的问题,请参考以下文章
For循环:通过字符迭代 - Javascript [重复]
如何使用包含键作为字符串和值作为映射迭代的ngFor循环映射进行迭代