我有一个CSV文件(两个不同的样本)

from io import StringIO
import pandas as pd

dfa = pd.read_csv(StringIO("""
      Date/Time     ID  C_1 C_2  C_3   C_4 C_5 C_6  C_7  C_8 C_9 C_10
"18/06/2023 3:51:53"  136 101 2028  61    4   3   18   0    0   2    2
"18/06/2023 3:51:54"  24  101 2029  65    0   0   0    1    1   NA   1
"18/06/2023 3:51:55"  16  101 2022  89    0   0   0    0    0   NA   7
"18/06/2023 3:51:56"  136 101 2024  90    0   0   0    0    0   NA   3
"18/06/2023 3:51:57"  24  101 2026  87    0   1   8    0    0   9    2
"18/06/2023 3:51:58"  136 101 2023  33    0   1   87   0    0   2    2"""), sep="\s+")

dfb = pd.read_csv(StringIO("""
      Date/Time     ID  C_1  C_2  C_3  C_4 C_5 C_6  C_7  C_8 C_9 C_10
"18/06/2023 3:51:53"  24  101 2029  65    0   0   0    1    1   NA   1
"18/06/2023 3:51:54"  136 101 2028  61    4   3   18   0    0   2    2
"18/06/2023 3:51:55"  16  101 2022  89    0   0   0    0    0   NA   7
"18/06/2023 3:51:56"  136 101 2024  90    0   0   0    0    0   NA   3
"18/06/2023 3:51:57"  136 101 2023  33    0   1   87   0    0   2    2
"18/06/2023 3:51:58"  24  101 2026  87    0   1   8    0    0   9    2"""), sep="\s+")

dfc = pd.read_csv(StringIO("""
      Date/Time     ID  C_1 C_2  C_3   C_4 C_5 C_6  C_7  C_8 C_9 C_10
"18/06/2023 3:51:53"  136 101 2028  61    4   3   18   0    0   2    2
"18/06/2023 3:51:54"  24  101 2029  65    0   0   0    1    1   NA   1
"18/06/2023 3:51:54"  136 102 2045  61    2   3   4    5    6   7    8
"18/06/2023 3:51:55"  16  101 2022  89    0   0   0    0    0   NA   7
"18/06/2023 3:51:56"  136 101 2024  90    0   0   0    0    0   NA   3
"18/06/2023 3:51:56"  16  102 2022  89    0   0   0    0    0   NA   11
"18/06/2023 3:51:56"  136 101 2024  90    0   0   0    0    0   NA   3
"18/06/2023 3:51:57"  24  101 2026  87    0   1   8    0    0   9    2
"18/06/2023 3:51:58"  24  102 2045  44    43  42  41   40   39  38   37
"18/06/2023 3:51:59"  136 101 2023  33    0   1   87   0    0   2    2"""), sep="\s+")

我正在try 使用以下条件读取行值(几列)-

  • 如果ID=‘16’与读取的‘Date/Time’、‘C_1’和‘C_10’列值匹配,请判断ID=‘16’.
  • 找到前面(From ID=‘16’)行的第一个位置,其中ID=‘136’,并读取从C_2到C_8的列值.
  • 找到ID=‘24’的第一个前一个或下一个(从ID=‘16’)行位置,并读取‘C_9’列值(如果两行都为空,则以不为空的为准).

输出-

      Date/Time     ID  C_1  C_2   C_3  C_4 C_5 C_6  C_7  C_8 C_9 C_10
18/06/2023  3:51:55 16  101  2028   61   4   3   18   0    0   9   7

推荐答案

如果我理解正确的话,请将这三种可能性分成两部分,分别使用maskffill/bfill,然后将groupby.first合并为一行:

m = df['ID'].eq('16')
m1 = df['ID'].isin(['16', '136'])
m2 = df['ID'].isin(['16', '24'])

cols = ['Date/Time', 'ID', 'C_1', 'C_10']

pd.concat([df.loc[m1].mask(m).ffill().loc[m, cols+['C_2', 'C_3', 'C_4', 'C_5', 'C_6', 'C_7', 'C_8']],
           df.loc[m2].mask(m).ffill().loc[m, cols+['C_9']],
           df.loc[m2].mask(m).bfill().loc[m, cols+['C_9']],
          ]).groupby(level=0).first()

一百零五

输出:

            Date/Time   ID    C_1  C_10     C_2   C_3  C_4  C_5   C_6  C_7  C_8  C_9
2  18/06/2023 3:51:53  136  101.0   2.0  2028.0  61.0  4.0  3.0  18.0  0.0  0.0  9.0

solution per C_1 group

m = df['ID'].eq('16')
m1 = df['ID'].isin(['16', '136'])
m2 = df['ID'].isin(['16', '24'])

cols = ['Date/Time', 'ID', 'C_1', 'C_10']

tmp = df.mask(m).fillna({'C_1': df['C_1']})

pd.concat([tmp.loc[m1].groupby(df['C_1']).ffill().loc[m, cols+['C_2', 'C_3', 'C_4', 'C_5', 'C_6', 'C_7', 'C_8']],
           tmp.loc[m2].groupby(df['C_1']).ffill().loc[m, cols+['C_9']],
           tmp.loc[m2].groupby(df['C_1']).bfill().loc[m, cols+['C_9']],
          ]).groupby(level=0).first()

输出(使用dfc作为输入):

            Date/Time   ID    C_1  C_10     C_2   C_3  C_4  C_5   C_6  C_7  C_8   C_9
3  18/06/2023 3:51:53  136  101.0   2.0  2028.0  61.0  4.0  3.0  18.0  0.0  0.0   9.0
5  18/06/2023 3:51:54  136  102.0   8.0  2045.0  61.0  2.0  3.0   4.0  5.0  6.0  38.0

Python-3.x相关问答推荐

Python:字典和列表:在列表字典中搜索子列表的有效方法

如何在输入正确的用户名和密码时添加按钮?

十进制浮点数到整型的转换错误

try 使用 GEKKO 求解非线性方程组.系统有多种解决方案,但 GEKKO 给出了错误的解决方案.我该如何解决?

删除Pandas 数据框行不起作用

使用大型多个数据集,其中每个数据集包含多个值 - Pytorch

根据另一列值对多个数据框列进行分组

获取以特定字母开头的姓氏

你如何表达一个没有参数的 Python Callable?

str.format_map(mapping) 和 str.format 有什么区别

如何将 SimpleGUI 与 Python 2.7 和 3.0 shell 集成

如何使用 asyncio 添加连接超时?

登录csv文件的正确方法是什么?

用 numpy nan 查找列表的最大值

如何将二进制(字符串)转换为浮点值?

Python:&= 运算符

变量类型注解NameError不一致

如何在python中创建代码对象?

finally 总是在 try 块返回之前运行,那么为什么 finally 块中的更新不会影响 try 块返回的变量的值呢?

将 Python SIGINT 重置为默认信号处理程序