【问题标题】:Selecting values in two columns based on conditions in another column (Python)根据另一列中的条件选择两列中的值(Python)
【发布时间】:2020-10-24 00:03:36
【问题描述】:

编辑:有人删除了他的答案。不知道为什么,因为它很有用。

如果之前有人问过这个问题,我很抱歉,我没有找到可以帮助我解决这个问题的解决方案。

我有一个包含不同变量的表,但我有兴趣在给定这些条件的情况下仅过滤某些值:在我的表中,“数字”列从 0 开始直到 x,然后再从 0 开始直到另一个 x。为此,我想在单独的数据框中过滤掉 lon 和 lat。 例如,对于第一个案例 0 到 5,我希望将 lon 和 lat 保存为“案例 1”,然后程序应该采用下一个 0 到 4 并将新的关联坐标打印到“案例 2”。这应该在所有情况下都继续,直到到达“数字”列的末尾。

我的表格示例:

number     lon(geo)     lat(geo)
0    -47     66
1    -45     66
2    -44     67
3    -41     67
4    -38     67
5    -37     67
0    -8      38
1    -7      39
2    -6      39
3    -5      40
4    -5      41
0    .        .
.    .        .

我尝试设置条件:

df = df[(df['number'] >= 0) & (df['number'] <= 0)]

最初,我想到了一个循环,中间有一些 break/next 或 continue 语句。

for i in range(1,len(number)):
    break    

while (float(i) for i in number > 0):
    lon = print (lon)
    lat = print (lat)
    break

我不确定“while True”循环是否可行?我对此感到有些困惑,因为这是我第一次处理此类问题,因此不胜感激。谢谢!

【问题讨论】:

  • for _, group in df.groupby(df["number"].eq(0).cumsum()): print (group)?

标签: python pandas loops dataframe conditional-statements


【解决方案1】:

试试这个:

import pandas as pd

df = pd.read_csv('test1.csv', delimiter=";")
print(df)

这是我的测试 CSV(带有伪造的 lonlat 值):

    number lon lat
0        0  a0  b0
1        1  a1  b1
2        2  a2  b2
3        3  a3  b3
4        4  a4  b4
5        0  a0  b0
6        1  a1  b1
7        2  a2  b2
8        3  a3  b3
9        4  a4  b4
10       5  a5  b5
11       0  a0  b0
12       1  a1  b1
13       2  a2  b2
14       3  a3  b3

我得到零的位置并在循环中使用它们:

zeros = df.index[df['number']==0].tolist()

new_dfs = []

for i in range(0,len(zeros)):
    try:
        df_aux = df.iloc[zeros[i]:zeros[i+1]]
    except:
        df_aux = df.iloc[zeros[i]:len(df)]
    
    new_dfs.append(df_aux)

这段代码的作用是根据零点(df['number'] == 0) 的位置拆分您的DataFrame。您最终会得到一个 DataFrame 列表,因此您可以对它们做任何您想做的事情。

【讨论】:

  • 谢谢你,在我的数据的第二次尝试中运行良好并且运行速度也很快:-)
【解决方案2】:

如果零是每个案例的开始,那么您可以循环遍历 number==0 的每个实例。确保数字列不是数据框的索引。

start_idx = df[df.number==0].index
cases = []    
for start,end in zip(start_idx[:-1], start_idx[1:]):
        cases.append(df.iloc[start:end])

【讨论】:

  • 谢谢!它在数字列和索引之间的混淆时帮助了我。
猜你喜欢
  • 1970-01-01
  • 2022-09-30
  • 1970-01-01
  • 1970-01-01
  • 2022-09-29
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 2015-08-26
相关资源
最近更新 更多