如何根据其他列和其他条件过滤熊猫数据框并仅保留行

蓝月亮

下面是我作为示例的数据框:

+--------------+-------+-------------+--------------+----------+-----------+
|      ID      | Part  | RequestFrom | QTYRequested | Location | QTYOnHand |
+--------------+-------+-------------+--------------+----------+-----------+
| PartACity 1  | PartA | City 1      |            1 | LocA     |         2 |
| PartACity 2  | PartA | City 2      |            1 | LocA     |         2 |
| PartACity 3  | PartA | City 3      |            1 | LocA     |         2 |
| PartACity 4  | PartA | City 4      |            1 | LocA     |         2 |
| PartACity 5  | PartA | City 5      |            1 | LocA     |         2 |
| PartACity 6  | PartA | City 6      |            1 | LocA     |         2 |
| PartACity 7  | PartA | City 7      |            1 | LocA     |         2 |
| PartACity 8  | PartA | City 8      |            1 | LocA     |         2 |
| PartACity 9  | PartA | City 9      |            1 | LocA     |         2 |
| PartACity 10 | PartA | City 10     |            1 | LocA     |         2 |
| PartACity 1  | PartA | City 1      |            1 | LocB     |         3 |
| PartACity 2  | PartA | City 2      |            1 | LocB     |         3 |
| PartACity 3  | PartA | City 3      |            1 | LocB     |         3 |
| PartACity 4  | PartA | City 4      |            1 | LocB     |         3 |
| PartACity 5  | PartA | City 5      |            1 | LocB     |         3 |
| PartACity 6  | PartA | City 6      |            1 | LocB     |         3 |
| PartACity 7  | PartA | City 7      |            1 | LocB     |         3 |
| PartACity 8  | PartA | City 8      |            1 | LocB     |         3 |
| PartACity 9  | PartA | City 9      |            1 | LocB     |         3 |
| PartACity 10 | PartA | City 10     |            1 | LocB     |         3 |
| PartACity 1  | PartA | City 1      |            1 | LocC     |         4 |
| PartACity 2  | PartA | City 2      |            1 | LocC     |         4 |
| PartACity 3  | PartA | City 3      |            1 | LocC     |         4 |
| PartACity 4  | PartA | City 4      |            1 | LocC     |         4 |
| PartACity 5  | PartA | City 5      |            1 | LocC     |         4 |
| PartACity 6  | PartA | City 6      |            1 | LocC     |         4 |
| PartACity 7  | PartA | City 7      |            1 | LocC     |         4 |
| PartACity 8  | PartA | City 8      |            1 | LocC     |         4 |
| PartACity 9  | PartA | City 9      |            1 | LocC     |         4 |
| PartACity 10 | PartA | City 10     |            1 | LocC     |         4 |
+--------------+-------+-------------+--------------+----------+-----------+

我想把上面的数据框变成这样:

+-------------+-------+-------------+--------------+----------+-----------+
|     ID      | Part  | RequestFrom | QTYRequested | Location | QTYOnHand |
+-------------+-------+-------------+--------------+----------+-----------+
| PartACity 1 | PartA | City 1      |            1 | LocA     |         2 |
| PartACity 2 | PartA | City 2      |            1 | LocA     |         2 |
| PartACity 3 | PartA | City 3      |            1 | LocB     |         3 |
| PartACity 4 | PartA | City 4      |            1 | LocB     |         3 |
| PartACity 5 | PartA | City 5      |            1 | LocB     |         3 |
| PartACity 6 | PartA | City 6      |            1 | LocC     |         4 |
| PartACity 7 | PartA | City 7      |            1 | LocC     |         4 |
| PartACity 8 | PartA | City 8      |            1 | LocC     |         4 |
| PartACity 9 | PartA | City 9      |            1 | LocC     |         4 |
+-------------+-------+-------------+--------------+----------+-----------+

如您所见,QTYOnHand的总数为9,但是对于A部分,我们有10个未清请求。

我想找到一种分配数量的更好方法。

由于LocA只有两个数量的PartA,因此我们仅保留前两行。

LocB有3个数量的PartA,接下来的3个数量将分配给LocB。

LocC有4个数量的PartA,接下来的4个数量将分配给LocC。

任何帮助将不胜感激!!!

Jarrettyeo
Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:24:40) [MSC v.1500 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import pandas as pd
>>> df = pd.DataFrame({
    'ID' : ['PartACity 1', 'PartACity 2', 'PartACity 3', 'PartACity 4', 'PartACity 5', 'PartACity 6', 'PartACity 7', 'PartACity 8', 'PartACity 9', 'PartACity 10', 'PartACity 1', 'PartACity 2', 'PartACity 3', 'PartACity 4', 'PartACity 5', 'PartACity 6', 'PartACity 7', 'PartACity 8', 'PartACity 9', 'PartACity 10', 'PartACity 1', 'PartACity 2', 'PartACity 3', 'PartACity 4', 'PartACity 5', 'PartACity 6', 'PartACity 7', 'PartACity 8', 'PartACity 9', 'PartACity 10'],
    'Part' : ['PartA', 'PartA', 'PartA', 'PartA', 'PartA', 'PartA', 'PartA', 'PartA', 'PartA', 'PartA', 'PartA', 'PartA', 'PartA', 'PartA', 'PartA', 'PartA', 'PartA', 'PartA', 'PartA', 'PartA', 'PartA', 'PartA', 'PartA', 'PartA', 'PartA', 'PartA', 'PartA', 'PartA', 'PartA', 'PartA'],
    'RequestFrom': ['City 1', 'City 2', 'City 3', 'City 4', 'City 5', 'City 6', 'City 7', 'City 8', 'City 9', 'City 10', 'City 1', 'City 2', 'City 3', 'City 4', 'City 5', 'City 6', 'City 7', 'City 8', 'City 9', 'City 10', 'City 1', 'City 2', 'City 3', 'City 4', 'City 5', 'City 6', 'City 7', 'City 8', 'City 9', 'City 10'],
    'QTYRequested': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    'Location': ['LocA', 'LocA', 'LocA', 'LocA', 'LocA', 'LocA', 'LocA', 'LocA', 'LocA', 'LocA', 'LocB', 'LocB', 'LocB', 'LocB', 'LocB', 'LocB', 'LocB', 'LocB', 'LocB', 'LocB', 'LocC', 'LocC', 'LocC', 'LocC', 'LocC', 'LocC', 'LocC', 'LocC', 'LocC', 'LocC'],
    'QTYOnHand': [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
    })
>>> print(df)
              ID Location     ...      QTYRequested  RequestFrom
0    PartACity 1     LocA     ...                 1       City 1
1    PartACity 2     LocA     ...                 1       City 2
2    PartACity 3     LocA     ...                 1       City 3
3    PartACity 4     LocA     ...                 1       City 4
4    PartACity 5     LocA     ...                 1       City 5
5    PartACity 6     LocA     ...                 1       City 6
6    PartACity 7     LocA     ...                 1       City 7
7    PartACity 8     LocA     ...                 1       City 8
8    PartACity 9     LocA     ...                 1       City 9
9   PartACity 10     LocA     ...                 1      City 10
10   PartACity 1     LocB     ...                 1       City 1
11   PartACity 2     LocB     ...                 1       City 2
12   PartACity 3     LocB     ...                 1       City 3
13   PartACity 4     LocB     ...                 1       City 4
14   PartACity 5     LocB     ...                 1       City 5
15   PartACity 6     LocB     ...                 1       City 6
16   PartACity 7     LocB     ...                 1       City 7
17   PartACity 8     LocB     ...                 1       City 8
18   PartACity 9     LocB     ...                 1       City 9
19  PartACity 10     LocB     ...                 1      City 10
20   PartACity 1     LocC     ...                 1       City 1
21   PartACity 2     LocC     ...                 1       City 2
22   PartACity 3     LocC     ...                 1       City 3
23   PartACity 4     LocC     ...                 1       City 4
24   PartACity 5     LocC     ...                 1       City 5
25   PartACity 6     LocC     ...                 1       City 6
26   PartACity 7     LocC     ...                 1       City 7
27   PartACity 8     LocC     ...                 1       City 8
28   PartACity 9     LocC     ...                 1       City 9
29  PartACity 10     LocC     ...                 1      City 10

[30 rows x 6 columns]

重复dftemp_df聚集库存量,并通过创建一个新的列跟踪留给每个位置的数量QTYLeft

>>> temp_df = df
>>> temp_df = temp_df.groupby('Location').agg({'QTYOnHand':'first'})
>>> temp_df = temp_df.reset_index()
>>> temp_df['QTYLeft'] =temp_df['QTYOnHand']
>>> print(temp_df)
  Location  QTYOnHand  QTYLeft
0     LocA          2        2
1     LocB          3        3
2     LocC          4        4

集团dfIDPartRequestFrom

>>> df = df.groupby(['ID', 'Part', 'RequestFrom']).first()
>>> df = df.reset_index()
>>> print(df)
             ID   Part     ...      QTYOnHand QTYRequested
0   PartACity 1  PartA     ...              2            1
1  PartACity 10  PartA     ...              2            1
2   PartACity 2  PartA     ...              2            1
3   PartACity 3  PartA     ...              2            1
4   PartACity 4  PartA     ...              2            1
5   PartACity 5  PartA     ...              2            1
6   PartACity 6  PartA     ...              2            1
7   PartACity 7  PartA     ...              2            1
8   PartACity 8  PartA     ...              2            1
9   PartACity 9  PartA     ...              2            1

[10 rows x 6 columns]

IDcolumn中的是字符串,因此不能用作按升序排序的索引,因此,我们创建了一个新的临时索引temp_index,该索引首先被称为df按升序排序,然后删除该索引:

>>> df = df.assign(temp_index=[int(float(i.split(' ')[-1])) for i in df['ID']])
>>> df = df.sort_values(by='temp_index')
>>> print(df)
             ID   Part    ...     QTYRequested temp_index
0   PartACity 1  PartA    ...                1          1
2   PartACity 2  PartA    ...                1          2
3   PartACity 3  PartA    ...                1          3
4   PartACity 4  PartA    ...                1          4
5   PartACity 5  PartA    ...                1          5
6   PartACity 6  PartA    ...                1          6
7   PartACity 7  PartA    ...                1          7
8   PartACity 8  PartA    ...                1          8
9   PartACity 9  PartA    ...                1          9
1  PartACity 10  PartA    ...                1         10

[10 rows x 7 columns]
>>> del df['temp_index']

创建一个新的用户定义函数(UDF)并将其应用于分配每个位置的可用数量,并根据您的问题首先分配较小的索引:

>>> def allocate_qty(row):
    global temp_df
    try:
        temp_df = temp_df[(temp_df['QTYLeft'] != 0)]
        avail_qty = temp_df['QTYOnHand'].values[0]
        avail_location = temp_df['Location'].values[0]
        temp_df['QTYLeft'].values[0] = temp_df['QTYLeft'].values[0] - row['QTYRequested']
        return avail_location, avail_qty
    except:
        return 'Not Allocated', 0


>>> df['Location'], df['QTYOnHand'] = zip(*df.apply(allocate_qty, axis=1))
>>> print(df)
             ID   Part     ...      QTYOnHand QTYRequested
0   PartACity 1  PartA     ...              2            1
2   PartACity 2  PartA     ...              2            1
3   PartACity 3  PartA     ...              3            1
4   PartACity 4  PartA     ...              3            1
5   PartACity 5  PartA     ...              3            1
6   PartACity 6  PartA     ...              4            1
7   PartACity 7  PartA     ...              4            1
8   PartACity 8  PartA     ...              4            1
9   PartACity 9  PartA     ...              4            1
1  PartACity 10  PartA     ...              0            1

[10 rows x 6 columns]

筛选出未设法分配资源的行:

>>> df = df[(df['Location'] != 'Not Allocated')]
>>> print(df)
            ID   Part     ...      QTYOnHand QTYRequested
0  PartACity 1  PartA     ...              2            1
2  PartACity 2  PartA     ...              2            1
3  PartACity 3  PartA     ...              3            1
4  PartACity 4  PartA     ...              3            1
5  PartACity 5  PartA     ...              3            1
6  PartACity 6  PartA     ...              4            1
7  PartACity 7  PartA     ...              4            1
8  PartACity 8  PartA     ...              4            1
9  PartACity 9  PartA     ...              4            1

[9 rows x 6 columns]

希望这可以帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

根据其他数据框过滤熊猫数据框列

根据今天的日期和其他熊猫条件过滤数据框

根据熊猫数据框中其他列的条件和值创建新列

如何根据其他列的条件对熊猫的“数据框”列进行操作

根据其他列的条件提取数据框的行子集

如何根据同一数据框其他列中的值过滤熊猫数据框中的结果?

如何根据列组的多(其他列)条件选择数据框行?

熊猫根据其他数据框的条件对行进行划分

熊猫:枢轴数据框并保留其他非数字列

根据pandas中其他列的条件,仅保留列的那些行中的值

分组并根据熊猫数据框中的其他列比较/过滤特定组

根据其他行的条件添加数据框行

根据其他行的条件填充数据框的行

日期时间其他行上的熊猫数据框条件

如何根据其他数据框进行过滤

根据先前的值和其他列替换或排序熊猫数据框列

如何根据其他数据框中的条件删除熊猫组

根据条件从其他数据框中添加列

合并数据框中的行,并保留其他列

熊猫:如何根据其他列值的条件求和?

有条件地连接数据框的行,并根据条件处理其他列

如何根据数据框的其他列创建新的熊猫列?

如何根据其他两列中的值在熊猫数据框中添加新列

根据匹配的列值与其他数据框的组合来删除行熊猫

如何分组重复值但保留数据框的其他列

如何使用熊猫数据框中其他列的条件语句对列中的值求和?

根据熊猫中的其他数据框过滤一个数据框

如何根据python中其他列的多个条件更新数据框中的现有列?

如何根据其他列的条件在数据框中创建新列?