我有一个具有这种特殊格式的文本文件
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
但我不想循环整个记录,有没有办法将我的数据帧分组到所需的数据帧?任何形式的帮助都将不胜感激,谢谢。
一旦您有了dfray
,您就可以遍历行并检查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
请注意,对于事件和id列中所需的行,这在很大程度上假定Z
列为null。让我知道这是否有效。