繁体   English   中英

我需要遍历 pandas df 和 select 仅在第一列中具有特定值的特定行,然后 select 来自该行的值

[英]I need to iterate through a pandas df and select only specific rows with a specific value in the first column and then select a value from that row

我有一个 dataframe 看起来像这样(它有更多的行和列,但这就是它的设置方式)

col1   col2     col3           col4  col5  col6  col7  col8
 MSH     a        b             e     e     r     a      d 
 PID     c   6002324^^^WAMT     d     s   PickB   x     
 OBR     e      pickC               PickD   v     z      q
 OBX     g        h             e           s     y       
 ORC     i        j             p     p     p     m      y
  \n   none      none         none  none  none  none   none
 MSH     a        b             e     e     r     a      d 
 PID     c    ^^^WAMT           d     s   PickF   x      o
 OBX     g        h             e     z     s     y      p 
 ORC     i        j                   p     p     m      y
 OBR     e      pickE               PickG   v     z      q
 OBX     g        h             e           s            t
 OBX     i        j             p     p     p     m      t
 OBX     g        h             e           s     y       
 OBX     i        j             p     p     p     m      y
  \n   none     none          none  none  none  none   none
 MSH     a        b             e     e     r     a      d 
 PID     c  43222346^^^WAMT     d     s   PickH   x      e
 OBX     g        h             e     z     s     y      p 
 ORC     i        j                   p     p     m      y
 OBR     e      pickI               PickJ   v     z      q
  \n   none      none         none  none  none  none   none
 MSH     a        b             e     e     r     a      d 
 PID     c    ^^^WAMT           d     s   PickK   x      o
 OBR     e      pickL               PickM   v     z      q
 OBX     g        h             e           s     y       

期望 output dataframe 看起来像这样:

col1       col2     col3    col4
^^^WAMT    PickB    PickC   PickD
^^^WAMT    PickK    PickL   PickM

这是作为 DataFrame 构造函数的数据:

d = {'col1': ['MSH', 'PID', 'OBR', 'OBX', 'ORC', '/n', 'MSH', 'PID', 'OBX', 'ORC', 'OBR', 'OBX', 'OBX', 'OBX', 'OBX', '\n', 'MSH', 'PID', 'OBX', 'ORC', 'OBR', '\n', 'MSH', 'PID', 'OBR', 'OBX'], 'col2': ['a', 'b', 'e', 'g', 'i', 'none', 'a', 'c', 'g', 'i', 'e', 'g', 'i', 'g', 'i', 'none', 'a', 'c', 'g', 'i', 'e', 'none', 'a', 'c', 'e', 'g'], 'col3': ['b', '6002324^^^WAMT', 'pickC', 'h', 'j', 'nine', 'b', '^^^WAMT', 'h', 'j', 'PickE', 'h', 'j', 'h', 'j', 'none', 'b', '43222346^^^WAMT', 'h', 'j', 'PickI', 'none', 'b', '^^^WAMT', 'PickL', 'h'], 'col4': ['e', 'd', '', 'e', 'p', 'none', 'e', 'd', 'e', '', '', 'e', 'p', 'e', 'p', 'none', 'e', 'd', 'e', '', '', 'none', 'e', 'd', '', 'e'], 'col5': ['e', 's', 'PickD', '', 'p', 'none', 'e', 's', 'z', 'p', 'PickG', '', 'p', '', 'p', 'none', 'e', 's', 'z', 'p', 'PickJ', 'none', 'e', 's', 'PickM', ''], 'col6': ['r', 'PickB', 'v', 's', 'p', 'none', 'r', 'PickF', 's', 'p', 'v', 's', 'p', 's', 'p', 'none', 'r', 'PickH', 's', 'p', 'v', 'none', 'r', 'PickK', 'v', 's'], 'col7': ['a', 'b', 'e', '', 'i', 'none', 'a', 'c', 'g', 'i', '', 'g', 'i', 'g', 'i', 'none', 'a', 'c', 'g', 'i', 'e', 'none', 'a', 'c', 'e', 'g'], 'col8': ['a', 'b', 'e', 'g', 'i', 'none', 'a', 'c', 'g', 'i', 'e', 'g', 'i', '', 'i', 'none', 'a', 'c', 'g', 'i', 'e', 'none', 'a', 'c', 'e', '']}
df = pd.DataFrame(d)

我需要遍历df中的每一行并检查df的第一列是否等于PID,然后我需要检查带有^^^WMNT的字段是否在^^^WMNT之前有任何数字,或者它是否是空的,然后我想从 PID 中取出 ^^^WMNT 和 PickF,从 OBR 中取出 PickE 和 PickG,然后在新的 df 中取出它们。 但是,如果 PID 第 3 列在 ^^^WAMT 前面有一个数值,那么我不想将 PID 或 OBR 字段添加到新的 df 中。

所以我不知道是否更容易只提取所有 PID 和 OBR 行,然后遍历它们以检查 PickA 是否有值,或者是否可以一起完成。 我也不知道像它想要的那样遍历行和列的最佳方法。

到目前为止,我已尝试使用此代码遍历 df,但我似乎没有工作:

for row, index in range(len(df)):
   if df.loc[df[row] == 'MSH']:
      if df.loc[df[index] == 0]:
         # this is where i would have the pick this column value but I am not sure how to write this

任何帮助,将不胜感激。

您可以构建一个组以在 PID 上拆分,然后使用列表推导来提取数据并将其提供给 DataFrame 构造函数:

group = df['col1'].eq('PID').cumsum().values

out = pd.DataFrame([
    (g.loc['PID', 'col3'], g.loc['OBR', 'col3'], g.loc['PID', 'col6'], g.loc['OBR', 'col5'])
     for i,g in df.set_index('col1').groupby(group)
     if i and g.loc['PID', 'col3'] == '^^^WAMT'],
    columns=['A', 'B', 'C', 'D']
     )

print(out)

Output:

         A      B      C      D
0  ^^^WAMT  PickE  PickF  PickG
1  ^^^WAMT  PickL  PickK  PickM

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM