Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于行记录创建分类列_Python_Pandas - Fatal编程技术网

Python 基于行记录创建分类列

Python 基于行记录创建分类列,python,pandas,Python,Pandas,我有一个特殊格式的文本文件 8493 RR44 0.140064597 3.03221084E-02 0.332000017 0.143124133 2.99523491E-02 0.333307326 8493 RR47 0.140064597 3.03221084E-02 0.332000017 0.141788140 2.88347229E-02 0.332700878

我有一个特殊格式的文本文件

 8493   RR44   
  0.140064597       3.03221084E-02  0.332000017    
  0.143124133       2.99523491E-02  0.333307326     
 8493   RR47   
  0.140064597       3.03221084E-02  0.332000017    
  0.141788140       2.88347229E-02  0.332700878    
第一列、第二列和第三列为X、Y和Z记录,8493和RR44以及RR47是代表事件和站点ID的记录类别,每个类别可能有不同长度的记录

我已将文本文件加载到数据框

ray = pd.read_csv('ray_test.txt',sep='\t',header=None)
ray.columns = ['X','Y','Z']
print(ray.head)
结果是,这是输出

              X         Y         Z
0   8493.000000      RR44       NaN
1      0.140065  3.03E-02  0.332000
2      0.143124  3.00E-02  0.333307
3  8493.000000      RR47       NaN
4      0.140065  3.03E-02  0.332000
5      0.141788  2.88E-02  0.332701
但我想根据站点ID和类似的事件以某种方式对数据进行分组或创建一个类别

              X         Y         Z        Event    ID
0      0.140065  3.03E-02  0.332000  8493.000000  RR44 
1      0.143124  3.00E-02  0.333307  8493.000000  RR44 
2      0.140065  3.03E-02  0.332000  8493.000000  RR47 
3      0.141788  2.88E-02  0.332701  8493.000000  RR47 

但我不想在整个记录上循环,有没有办法将我的数据帧分组到所需的数据帧?感谢您的任何帮助。

一旦您有了df
射线
,您就可以在行中循环,并检查
Z
列是否为
NaN
。如果是,则在后续行中存储
X
Y
的值,直到获得另一行
Z
等于
NaN

for idx, row in ray.iterrows():
    if pd.isnull(row['Z']):
        event, id = row['X'], row['Y']
    else:
        ray.at[idx, 'event'] = event
        ray.at[idx, 'id'] = id

ray = ray[ray['Z'].isnull()==False]
print(ray)
输出:

          X       Y         Z   event    id
1  0.140065  0.0303  0.332000  8493.0  RR44
2  0.143124    0.03  0.333307  8493.0  RR44
4  0.140065  0.0303  0.332000  8493.0  RR47
5  0.141788  0.0288  0.332701  8493.0  RR47

请注意,这严重地假设
Z
列对于事件和id列中所需的行为空。让我知道这是否有效

它们都是由两行数据分隔的。我不这么认为,因为每个站点可能记录不同长度的数据,所以我只取了数据的一小部分data@azharharisandi您想根据什么标准来标识不同的行集?很抱歉我不活动,我感谢您的回答。我已经用与您相同的逻辑解决了这个问题,但是使用了更混乱的代码,您的代码显然更可读,非常感谢!很高兴这有帮助