Welcome to Software Development on Codidact!
Will you help us build our independent community of developers helping developers? We're small and trying to grow. We welcome questions about all aspects of software development, from design to code to QA and more. Got questions? Got answers? Got code you'd like someone to review? Please join us.
Post History
MWE import random import pandas as pd from itertools import product random.seed(12345) dies = [1, 2] cells = list(range(10)) currents = [100, 200, 300] dcc = list(product(dies, ce...
#7: Post edited
I have a dataset showing electrical current and resistance measurements on various cells of different dies. There are multiple measurements for each cell.If a cell is ever observed to have resistance <100k while current = 100, that cell is considered a "bad cell". I want to remove all bad cells of that die only (not other dies).How can I do this efficiently (without multiple for loops)?- # MWE
- ```py
- import random
- import pandas as pd
- from itertools import product
- random.seed(12345)
- dies = [1, 2]
- cells = list(range(10))
- currents = [100, 200, 300]
- dcc = list(product(dies, cells, currents))
- resistances = random.choices(range(250000 + 1), k=len(dcc))
- df = pd.DataFrame(dcc, columns=["Die", "Cell", "Current"])
- df["Resistance"] = resistances
- b100 = df[(df["Current"] == 100) & (df["Resistance"] < 100000)]
- ```
# ExampleIn the dataset below:* On die 1, cells 1, 5, 7, 8 are bad and should be removed.* On die 2, cells 1, 5, 6, 9 are bad and should be removed.* Cells 6, 9 should **not** be removed from die 2 (or others, besides die 1).* Cells 7, 8 should **not** be removed from die 1 (or others, besides die 2).- Tried:
- ```py
- rm_dies = b100["Die"].to_list()
- rm_cells = b100["Cell"].to_list()
- for die, cell in zip(rm_dies, rm_cells):
- df = df.mask((df["Die"] == die) & (df["Cell"] == cell))
- ```
- This works, but is very slow on large dataframes and is not
- elegant.
- ```txt
- Die Cell Current Resistance
- 0 1.0 0.0 100.0 104155.0
- 1 1.0 0.0 200.0 2542.0
- 2 1.0 0.0 300.0 206302.0
- 3 NaN NaN NaN NaN
- 4 NaN NaN NaN NaN
- 5 NaN NaN NaN NaN
- 6 1.0 2.0 100.0 141502.0
- 7 1.0 2.0 200.0 40422.0
- 8 1.0 2.0 300.0 31066.0
- 9 1.0 3.0 100.0 108234.0
- 10 1.0 3.0 200.0 140520.0
- 11 1.0 3.0 300.0 43586.0
- 12 1.0 4.0 100.0 138305.0
- 13 1.0 4.0 200.0 88725.0
- 14 1.0 4.0 300.0 239517.0
- 15 NaN NaN NaN NaN
- 16 NaN NaN NaN NaN
- 17 NaN NaN NaN NaN
- 18 1.0 6.0 100.0 125984.0
- 19 1.0 6.0 200.0 37036.0
- 20 1.0 6.0 300.0 179742.0
- 21 NaN NaN NaN NaN
- 22 NaN NaN NaN NaN
- 23 NaN NaN NaN NaN
- 24 NaN NaN NaN NaN
- 25 NaN NaN NaN NaN
- 26 NaN NaN NaN NaN
- 27 1.0 9.0 100.0 186133.0
- 28 1.0 9.0 200.0 863.0
- 29 1.0 9.0 300.0 235060.0
- 30 2.0 0.0 100.0 217692.0
- 31 2.0 0.0 200.0 192709.0
- 32 2.0 0.0 300.0 44718.0
- 33 NaN NaN NaN NaN
- 34 NaN NaN NaN NaN
- 35 NaN NaN NaN NaN
- 36 2.0 2.0 100.0 144522.0
- 37 2.0 2.0 200.0 184146.0
- 38 2.0 2.0 300.0 58155.0
- 39 2.0 3.0 100.0 130899.0
- 40 2.0 3.0 200.0 177347.0
- 41 2.0 3.0 300.0 206209.0
- 42 2.0 4.0 100.0 201781.0
- 43 2.0 4.0 200.0 58077.0
- 44 2.0 4.0 300.0 218298.0
- 45 NaN NaN NaN NaN
- 46 NaN NaN NaN NaN
- 47 NaN NaN NaN NaN
- 48 NaN NaN NaN NaN
- 49 NaN NaN NaN NaN
- 50 NaN NaN NaN NaN
- 51 2.0 7.0 100.0 239666.0
- 52 2.0 7.0 200.0 10384.0
- 53 2.0 7.0 300.0 41034.0
- 54 2.0 8.0 100.0 245824.0
- 55 2.0 8.0 200.0 208052.0
- 56 2.0 8.0 300.0 37568.0
- 57 NaN NaN NaN NaN
- 58 NaN NaN NaN NaN
- 59 NaN NaN NaN NaN
- ```
- # Notes
- Ultimately I want to remove these cells from the dataframe. `dropna()`
excluded from above calls for illustrative purposes.
- # MWE
- ```py
- import random
- import pandas as pd
- from itertools import product
- random.seed(12345)
- dies = [1, 2]
- cells = list(range(10))
- currents = [100, 200, 300]
- dcc = list(product(dies, cells, currents))
- resistances = random.choices(range(250000 + 1), k=len(dcc))
- df = pd.DataFrame(dcc, columns=["Die", "Cell", "Current"])
- df["Resistance"] = resistances
- b100 = df[(df["Current"] == 100) & (df["Resistance"] < 100000)]
- ```
- ```txt
- df:
- Die Cell Current Resistance
- 0 1 0 100 104155
- 1 1 0 200 2542
- 2 1 0 300 206302
- 3 1 1 100 74660
- 4 1 1 200 92103
- 5 1 1 300 48415
- 6 1 2 100 141502
- 7 1 2 200 40422
- 8 1 2 300 31066
- 9 1 3 100 108234
- 10 1 3 200 140520
- 11 1 3 300 43586
- 12 1 4 100 138305
- 13 1 4 200 88725
- 14 1 4 300 239517
- 15 1 5 100 22823
- 16 1 5 200 244660
- 17 1 5 300 103030
- 18 1 6 100 125984
- 19 1 6 200 37036
- 20 1 6 300 179742
- 21 1 7 100 47493
- 22 1 7 200 85390
- 23 1 7 300 5880
- 24 1 8 100 84879
- 25 1 8 200 241871
- 26 1 8 300 244700
- 27 1 9 100 186133
- 28 1 9 200 863
- 29 1 9 300 235060
- 30 2 0 100 217692
- 31 2 0 200 192709
- 32 2 0 300 44718
- 33 2 1 100 24875
- 34 2 1 200 103633
- 35 2 1 300 221385
- 36 2 2 100 144522
- 37 2 2 200 184146
- 38 2 2 300 58155
- 39 2 3 100 130899
- 40 2 3 200 177347
- 41 2 3 300 206209
- 42 2 4 100 201781
- 43 2 4 200 58077
- 44 2 4 300 218298
- 45 2 5 100 54095
- 46 2 5 200 200475
- 47 2 5 300 138771
- 48 2 6 100 46457
- 49 2 6 200 147152
- 50 2 6 300 129560
- 51 2 7 100 239666
- 52 2 7 200 10384
- 53 2 7 300 41034
- 54 2 8 100 245824
- 55 2 8 200 208052
- 56 2 8 300 37568
- 57 2 9 100 57278
- 58 2 9 200 134785
- 59 2 9 300 39245
- ```
- ```txt
- b100:
- Die Cell Current Resistance
- 3 1 1 100 74660
- 15 1 5 100 22823
- 21 1 7 100 47493
- 24 1 8 100 84879
- 33 2 1 100 24875
- 45 2 5 100 54095
- 48 2 6 100 46457
- 57 2 9 100 57278
- ```
- # Problem
- If a cell is below 100k resistance, at 100 current, I want to remove
- that cell everywhere, within that die. `b100` above shows that I want to
- remove all entries for cells 1, 5, 7, and 8 in die 1, and all entries
- for cells 1, 5, 6, and 9 in die 2.
- Cells 6 and 9 should not be removed from die 1, and cells 7 and 8 should not be removed from die 2.
- How would I do this programatically?
- # Tried
- Tried:
- ```py
- df = df.mask((df["Die"].isin(b100["Die"])) & (df["Cell"].isin(b100["Cell"])))
- ```
- But this removes every cell marked, in either die:
- ```txt
- Die Cell Current Resistance
- 0 1.0 0.0 100.0 104155.0
- 1 1.0 0.0 200.0 2542.0
- 2 1.0 0.0 300.0 206302.0
- 3 NaN NaN NaN NaN
- 4 NaN NaN NaN NaN
- 5 NaN NaN NaN NaN
- 6 1.0 2.0 100.0 141502.0
- 7 1.0 2.0 200.0 40422.0
- 8 1.0 2.0 300.0 31066.0
- 9 1.0 3.0 100.0 108234.0
- 10 1.0 3.0 200.0 140520.0
- 11 1.0 3.0 300.0 43586.0
- 12 1.0 4.0 100.0 138305.0
- 13 1.0 4.0 200.0 88725.0
- 14 1.0 4.0 300.0 239517.0
- 15 NaN NaN NaN NaN
- 16 NaN NaN NaN NaN
- 17 NaN NaN NaN NaN
- 18 NaN NaN NaN NaN
- 19 NaN NaN NaN NaN
- 20 NaN NaN NaN NaN
- 21 NaN NaN NaN NaN
- 22 NaN NaN NaN NaN
- 23 NaN NaN NaN NaN
- 24 NaN NaN NaN NaN
- 25 NaN NaN NaN NaN
- 26 NaN NaN NaN NaN
- 27 NaN NaN NaN NaN
- 28 NaN NaN NaN NaN
- 29 NaN NaN NaN NaN
- 30 2.0 0.0 100.0 217692.0
- 31 2.0 0.0 200.0 192709.0
- 32 2.0 0.0 300.0 44718.0
- 33 NaN NaN NaN NaN
- 34 NaN NaN NaN NaN
- 35 NaN NaN NaN NaN
- 36 2.0 2.0 100.0 144522.0
- 37 2.0 2.0 200.0 184146.0
- 38 2.0 2.0 300.0 58155.0
- 39 2.0 3.0 100.0 130899.0
- 40 2.0 3.0 200.0 177347.0
- 41 2.0 3.0 300.0 206209.0
- 42 2.0 4.0 100.0 201781.0
- 43 2.0 4.0 200.0 58077.0
- 44 2.0 4.0 300.0 218298.0
- 45 NaN NaN NaN NaN
- 46 NaN NaN NaN NaN
- 47 NaN NaN NaN NaN
- 48 NaN NaN NaN NaN
- 49 NaN NaN NaN NaN
- 50 NaN NaN NaN NaN
- 51 NaN NaN NaN NaN
- 52 NaN NaN NaN NaN
- 53 NaN NaN NaN NaN
- 54 NaN NaN NaN NaN
- 55 NaN NaN NaN NaN
- 56 NaN NaN NaN NaN
- 57 NaN NaN NaN NaN
- 58 NaN NaN NaN NaN
- 59 NaN NaN NaN NaN
- ```
- Tried:
- ```py
- rm_dies = b100["Die"].to_list()
- rm_cells = b100["Cell"].to_list()
- for die, cell in zip(rm_dies, rm_cells):
- df = df.mask((df["Die"] == die) & (df["Cell"] == cell))
- ```
- This works, but is very slow on large dataframes and is not
- elegant.
- ```txt
- Die Cell Current Resistance
- 0 1.0 0.0 100.0 104155.0
- 1 1.0 0.0 200.0 2542.0
- 2 1.0 0.0 300.0 206302.0
- 3 NaN NaN NaN NaN
- 4 NaN NaN NaN NaN
- 5 NaN NaN NaN NaN
- 6 1.0 2.0 100.0 141502.0
- 7 1.0 2.0 200.0 40422.0
- 8 1.0 2.0 300.0 31066.0
- 9 1.0 3.0 100.0 108234.0
- 10 1.0 3.0 200.0 140520.0
- 11 1.0 3.0 300.0 43586.0
- 12 1.0 4.0 100.0 138305.0
- 13 1.0 4.0 200.0 88725.0
- 14 1.0 4.0 300.0 239517.0
- 15 NaN NaN NaN NaN
- 16 NaN NaN NaN NaN
- 17 NaN NaN NaN NaN
- 18 1.0 6.0 100.0 125984.0
- 19 1.0 6.0 200.0 37036.0
- 20 1.0 6.0 300.0 179742.0
- 21 NaN NaN NaN NaN
- 22 NaN NaN NaN NaN
- 23 NaN NaN NaN NaN
- 24 NaN NaN NaN NaN
- 25 NaN NaN NaN NaN
- 26 NaN NaN NaN NaN
- 27 1.0 9.0 100.0 186133.0
- 28 1.0 9.0 200.0 863.0
- 29 1.0 9.0 300.0 235060.0
- 30 2.0 0.0 100.0 217692.0
- 31 2.0 0.0 200.0 192709.0
- 32 2.0 0.0 300.0 44718.0
- 33 NaN NaN NaN NaN
- 34 NaN NaN NaN NaN
- 35 NaN NaN NaN NaN
- 36 2.0 2.0 100.0 144522.0
- 37 2.0 2.0 200.0 184146.0
- 38 2.0 2.0 300.0 58155.0
- 39 2.0 3.0 100.0 130899.0
- 40 2.0 3.0 200.0 177347.0
- 41 2.0 3.0 300.0 206209.0
- 42 2.0 4.0 100.0 201781.0
- 43 2.0 4.0 200.0 58077.0
- 44 2.0 4.0 300.0 218298.0
- 45 NaN NaN NaN NaN
- 46 NaN NaN NaN NaN
- 47 NaN NaN NaN NaN
- 48 NaN NaN NaN NaN
- 49 NaN NaN NaN NaN
- 50 NaN NaN NaN NaN
- 51 2.0 7.0 100.0 239666.0
- 52 2.0 7.0 200.0 10384.0
- 53 2.0 7.0 300.0 41034.0
- 54 2.0 8.0 100.0 245824.0
- 55 2.0 8.0 200.0 208052.0
- 56 2.0 8.0 300.0 37568.0
- 57 NaN NaN NaN NaN
- 58 NaN NaN NaN NaN
- 59 NaN NaN NaN NaN
- ```
- # Notes
- Ultimately I want to remove these cells from the dataframe. `dropna()`
- excluded from above calls for illustrative purposes.
#6: Post edited
- I have a dataset showing electrical current and resistance measurements on various cells of different dies. There are multiple measurements for each cell.
- If a cell is ever observed to have resistance <100k while current = 100, that cell is considered a "bad cell". I want to remove all bad cells of that die only (not other dies).
- How can I do this efficiently (without multiple for loops)?
- # Example
- In the dataset below:
- * On die 1, cells 1, 5, 7, 8 are bad and should be removed.
- * On die 2, cells 1, 5, 6, 9 are bad and should be removed.
- * Cells 6, 9 should **not** be removed from die 2 (or others, besides die 1).
- * Cells 7, 8 should **not** be removed from die 1 (or others, besides die 2).
- Tried:
- ```py
- rm_dies = b100["Die"].to_list()
- rm_cells = b100["Cell"].to_list()
- for die, cell in zip(rm_dies, rm_cells):
- df = df.mask((df["Die"] == die) & (df["Cell"] == cell))
- ```
- This works, but is very slow on large dataframes and is not
- elegant.
- ```txt
- Die Cell Current Resistance
- 0 1.0 0.0 100.0 104155.0
- 1 1.0 0.0 200.0 2542.0
- 2 1.0 0.0 300.0 206302.0
- 3 NaN NaN NaN NaN
- 4 NaN NaN NaN NaN
- 5 NaN NaN NaN NaN
- 6 1.0 2.0 100.0 141502.0
- 7 1.0 2.0 200.0 40422.0
- 8 1.0 2.0 300.0 31066.0
- 9 1.0 3.0 100.0 108234.0
- 10 1.0 3.0 200.0 140520.0
- 11 1.0 3.0 300.0 43586.0
- 12 1.0 4.0 100.0 138305.0
- 13 1.0 4.0 200.0 88725.0
- 14 1.0 4.0 300.0 239517.0
- 15 NaN NaN NaN NaN
- 16 NaN NaN NaN NaN
- 17 NaN NaN NaN NaN
- 18 1.0 6.0 100.0 125984.0
- 19 1.0 6.0 200.0 37036.0
- 20 1.0 6.0 300.0 179742.0
- 21 NaN NaN NaN NaN
- 22 NaN NaN NaN NaN
- 23 NaN NaN NaN NaN
- 24 NaN NaN NaN NaN
- 25 NaN NaN NaN NaN
- 26 NaN NaN NaN NaN
- 27 1.0 9.0 100.0 186133.0
- 28 1.0 9.0 200.0 863.0
- 29 1.0 9.0 300.0 235060.0
- 30 2.0 0.0 100.0 217692.0
- 31 2.0 0.0 200.0 192709.0
- 32 2.0 0.0 300.0 44718.0
- 33 NaN NaN NaN NaN
- 34 NaN NaN NaN NaN
- 35 NaN NaN NaN NaN
- 36 2.0 2.0 100.0 144522.0
- 37 2.0 2.0 200.0 184146.0
- 38 2.0 2.0 300.0 58155.0
- 39 2.0 3.0 100.0 130899.0
- 40 2.0 3.0 200.0 177347.0
- 41 2.0 3.0 300.0 206209.0
- 42 2.0 4.0 100.0 201781.0
- 43 2.0 4.0 200.0 58077.0
- 44 2.0 4.0 300.0 218298.0
- 45 NaN NaN NaN NaN
- 46 NaN NaN NaN NaN
- 47 NaN NaN NaN NaN
- 48 NaN NaN NaN NaN
- 49 NaN NaN NaN NaN
- 50 NaN NaN NaN NaN
- 51 2.0 7.0 100.0 239666.0
- 52 2.0 7.0 200.0 10384.0
- 53 2.0 7.0 300.0 41034.0
- 54 2.0 8.0 100.0 245824.0
- 55 2.0 8.0 200.0 208052.0
- 56 2.0 8.0 300.0 37568.0
- 57 NaN NaN NaN NaN
- 58 NaN NaN NaN NaN
- 59 NaN NaN NaN NaN
- ```
- # Notes
- Ultimately I want to remove these cells from the dataframe. `dropna()`
- excluded from above calls for illustrative purposes.
- I have a dataset showing electrical current and resistance measurements on various cells of different dies. There are multiple measurements for each cell.
- If a cell is ever observed to have resistance <100k while current = 100, that cell is considered a "bad cell". I want to remove all bad cells of that die only (not other dies).
- How can I do this efficiently (without multiple for loops)?
- # MWE
- ```py
- import random
- import pandas as pd
- from itertools import product
- random.seed(12345)
- dies = [1, 2]
- cells = list(range(10))
- currents = [100, 200, 300]
- dcc = list(product(dies, cells, currents))
- resistances = random.choices(range(250000 + 1), k=len(dcc))
- df = pd.DataFrame(dcc, columns=["Die", "Cell", "Current"])
- df["Resistance"] = resistances
- b100 = df[(df["Current"] == 100) & (df["Resistance"] < 100000)]
- ```
- # Example
- In the dataset below:
- * On die 1, cells 1, 5, 7, 8 are bad and should be removed.
- * On die 2, cells 1, 5, 6, 9 are bad and should be removed.
- * Cells 6, 9 should **not** be removed from die 2 (or others, besides die 1).
- * Cells 7, 8 should **not** be removed from die 1 (or others, besides die 2).
- Tried:
- ```py
- rm_dies = b100["Die"].to_list()
- rm_cells = b100["Cell"].to_list()
- for die, cell in zip(rm_dies, rm_cells):
- df = df.mask((df["Die"] == die) & (df["Cell"] == cell))
- ```
- This works, but is very slow on large dataframes and is not
- elegant.
- ```txt
- Die Cell Current Resistance
- 0 1.0 0.0 100.0 104155.0
- 1 1.0 0.0 200.0 2542.0
- 2 1.0 0.0 300.0 206302.0
- 3 NaN NaN NaN NaN
- 4 NaN NaN NaN NaN
- 5 NaN NaN NaN NaN
- 6 1.0 2.0 100.0 141502.0
- 7 1.0 2.0 200.0 40422.0
- 8 1.0 2.0 300.0 31066.0
- 9 1.0 3.0 100.0 108234.0
- 10 1.0 3.0 200.0 140520.0
- 11 1.0 3.0 300.0 43586.0
- 12 1.0 4.0 100.0 138305.0
- 13 1.0 4.0 200.0 88725.0
- 14 1.0 4.0 300.0 239517.0
- 15 NaN NaN NaN NaN
- 16 NaN NaN NaN NaN
- 17 NaN NaN NaN NaN
- 18 1.0 6.0 100.0 125984.0
- 19 1.0 6.0 200.0 37036.0
- 20 1.0 6.0 300.0 179742.0
- 21 NaN NaN NaN NaN
- 22 NaN NaN NaN NaN
- 23 NaN NaN NaN NaN
- 24 NaN NaN NaN NaN
- 25 NaN NaN NaN NaN
- 26 NaN NaN NaN NaN
- 27 1.0 9.0 100.0 186133.0
- 28 1.0 9.0 200.0 863.0
- 29 1.0 9.0 300.0 235060.0
- 30 2.0 0.0 100.0 217692.0
- 31 2.0 0.0 200.0 192709.0
- 32 2.0 0.0 300.0 44718.0
- 33 NaN NaN NaN NaN
- 34 NaN NaN NaN NaN
- 35 NaN NaN NaN NaN
- 36 2.0 2.0 100.0 144522.0
- 37 2.0 2.0 200.0 184146.0
- 38 2.0 2.0 300.0 58155.0
- 39 2.0 3.0 100.0 130899.0
- 40 2.0 3.0 200.0 177347.0
- 41 2.0 3.0 300.0 206209.0
- 42 2.0 4.0 100.0 201781.0
- 43 2.0 4.0 200.0 58077.0
- 44 2.0 4.0 300.0 218298.0
- 45 NaN NaN NaN NaN
- 46 NaN NaN NaN NaN
- 47 NaN NaN NaN NaN
- 48 NaN NaN NaN NaN
- 49 NaN NaN NaN NaN
- 50 NaN NaN NaN NaN
- 51 2.0 7.0 100.0 239666.0
- 52 2.0 7.0 200.0 10384.0
- 53 2.0 7.0 300.0 41034.0
- 54 2.0 8.0 100.0 245824.0
- 55 2.0 8.0 200.0 208052.0
- 56 2.0 8.0 300.0 37568.0
- 57 NaN NaN NaN NaN
- 58 NaN NaN NaN NaN
- 59 NaN NaN NaN NaN
- ```
- # Notes
- Ultimately I want to remove these cells from the dataframe. `dropna()`
- excluded from above calls for illustrative purposes.
#5: Post edited
Remove entries by two-column ID everywhere, that meet a condition somewhere
# MWE```pyimport randomimport pandas as pdfrom itertools import productrandom.seed(12345)dies = [1, 2]cells = list(range(10))currents = [100, 200, 300]dcc = list(product(dies, cells, currents))resistances = random.choices(range(250000 + 1), k=len(dcc))df = pd.DataFrame(dcc, columns=["Die", "Cell", "Current"])df["Resistance"] = resistancesb100 = df[(df["Current"] == 100) & (df["Resistance"] < 100000)]``````txtdf:Die Cell Current Resistance0 1 0 100 1041551 1 0 200 25422 1 0 300 2063023 1 1 100 746604 1 1 200 921035 1 1 300 484156 1 2 100 1415027 1 2 200 404228 1 2 300 310669 1 3 100 10823410 1 3 200 14052011 1 3 300 4358612 1 4 100 13830513 1 4 200 8872514 1 4 300 23951715 1 5 100 2282316 1 5 200 24466017 1 5 300 10303018 1 6 100 12598419 1 6 200 3703620 1 6 300 17974221 1 7 100 4749322 1 7 200 8539023 1 7 300 588024 1 8 100 8487925 1 8 200 24187126 1 8 300 24470027 1 9 100 18613328 1 9 200 86329 1 9 300 23506030 2 0 100 21769231 2 0 200 19270932 2 0 300 4471833 2 1 100 2487534 2 1 200 10363335 2 1 300 22138536 2 2 100 14452237 2 2 200 18414638 2 2 300 5815539 2 3 100 13089940 2 3 200 17734741 2 3 300 20620942 2 4 100 20178143 2 4 200 5807744 2 4 300 21829845 2 5 100 5409546 2 5 200 20047547 2 5 300 13877148 2 6 100 4645749 2 6 200 14715250 2 6 300 12956051 2 7 100 23966652 2 7 200 1038453 2 7 300 4103454 2 8 100 24582455 2 8 200 20805256 2 8 300 3756857 2 9 100 5727858 2 9 200 13478559 2 9 300 39245``````txtb100:Die Cell Current Resistance3 1 1 100 7466015 1 5 100 2282321 1 7 100 4749324 1 8 100 8487933 2 1 100 2487545 2 5 100 5409548 2 6 100 4645757 2 9 100 57278```# ProblemIf a cell is below 100k resistance, at 100 current, I want to removethat cell everywhere, within that die. `b100` above shows that I want toremove all entries for cells 1, 5, 7, and 8 in die 1, and all entriesfor cells 1, 5, 6, and 9 in die 2.Cells 6 and 9 should not be removed from die 1, and cells 7 and 8 should not be removed from die 2.How would I do this programatically?# TriedTried:```pydf = df.mask((df["Die"].isin(b100["Die"])) & (df["Cell"].isin(b100["Cell"])))```But this removes every cell marked, in either die:```txtDie Cell Current Resistance0 1.0 0.0 100.0 104155.01 1.0 0.0 200.0 2542.02 1.0 0.0 300.0 206302.03 NaN NaN NaN NaN4 NaN NaN NaN NaN5 NaN NaN NaN NaN6 1.0 2.0 100.0 141502.07 1.0 2.0 200.0 40422.08 1.0 2.0 300.0 31066.09 1.0 3.0 100.0 108234.010 1.0 3.0 200.0 140520.011 1.0 3.0 300.0 43586.012 1.0 4.0 100.0 138305.013 1.0 4.0 200.0 88725.014 1.0 4.0 300.0 239517.015 NaN NaN NaN NaN16 NaN NaN NaN NaN17 NaN NaN NaN NaN18 NaN NaN NaN NaN19 NaN NaN NaN NaN20 NaN NaN NaN NaN21 NaN NaN NaN NaN22 NaN NaN NaN NaN23 NaN NaN NaN NaN24 NaN NaN NaN NaN25 NaN NaN NaN NaN26 NaN NaN NaN NaN27 NaN NaN NaN NaN28 NaN NaN NaN NaN29 NaN NaN NaN NaN30 2.0 0.0 100.0 217692.031 2.0 0.0 200.0 192709.032 2.0 0.0 300.0 44718.033 NaN NaN NaN NaN34 NaN NaN NaN NaN35 NaN NaN NaN NaN36 2.0 2.0 100.0 144522.037 2.0 2.0 200.0 184146.038 2.0 2.0 300.0 58155.039 2.0 3.0 100.0 130899.040 2.0 3.0 200.0 177347.041 2.0 3.0 300.0 206209.042 2.0 4.0 100.0 201781.043 2.0 4.0 200.0 58077.044 2.0 4.0 300.0 218298.045 NaN NaN NaN NaN46 NaN NaN NaN NaN47 NaN NaN NaN NaN48 NaN NaN NaN NaN49 NaN NaN NaN NaN50 NaN NaN NaN NaN51 NaN NaN NaN NaN52 NaN NaN NaN NaN53 NaN NaN NaN NaN54 NaN NaN NaN NaN55 NaN NaN NaN NaN56 NaN NaN NaN NaN57 NaN NaN NaN NaN58 NaN NaN NaN NaN59 NaN NaN NaN NaN```- Tried:
- ```py
- rm_dies = b100["Die"].to_list()
- rm_cells = b100["Cell"].to_list()
- for die, cell in zip(rm_dies, rm_cells):
- df = df.mask((df["Die"] == die) & (df["Cell"] == cell))
- ```
- This works, but is very slow on large dataframes and is not
- elegant.
- ```txt
- Die Cell Current Resistance
- 0 1.0 0.0 100.0 104155.0
- 1 1.0 0.0 200.0 2542.0
- 2 1.0 0.0 300.0 206302.0
- 3 NaN NaN NaN NaN
- 4 NaN NaN NaN NaN
- 5 NaN NaN NaN NaN
- 6 1.0 2.0 100.0 141502.0
- 7 1.0 2.0 200.0 40422.0
- 8 1.0 2.0 300.0 31066.0
- 9 1.0 3.0 100.0 108234.0
- 10 1.0 3.0 200.0 140520.0
- 11 1.0 3.0 300.0 43586.0
- 12 1.0 4.0 100.0 138305.0
- 13 1.0 4.0 200.0 88725.0
- 14 1.0 4.0 300.0 239517.0
- 15 NaN NaN NaN NaN
- 16 NaN NaN NaN NaN
- 17 NaN NaN NaN NaN
- 18 1.0 6.0 100.0 125984.0
- 19 1.0 6.0 200.0 37036.0
- 20 1.0 6.0 300.0 179742.0
- 21 NaN NaN NaN NaN
- 22 NaN NaN NaN NaN
- 23 NaN NaN NaN NaN
- 24 NaN NaN NaN NaN
- 25 NaN NaN NaN NaN
- 26 NaN NaN NaN NaN
- 27 1.0 9.0 100.0 186133.0
- 28 1.0 9.0 200.0 863.0
- 29 1.0 9.0 300.0 235060.0
- 30 2.0 0.0 100.0 217692.0
- 31 2.0 0.0 200.0 192709.0
- 32 2.0 0.0 300.0 44718.0
- 33 NaN NaN NaN NaN
- 34 NaN NaN NaN NaN
- 35 NaN NaN NaN NaN
- 36 2.0 2.0 100.0 144522.0
- 37 2.0 2.0 200.0 184146.0
- 38 2.0 2.0 300.0 58155.0
- 39 2.0 3.0 100.0 130899.0
- 40 2.0 3.0 200.0 177347.0
- 41 2.0 3.0 300.0 206209.0
- 42 2.0 4.0 100.0 201781.0
- 43 2.0 4.0 200.0 58077.0
- 44 2.0 4.0 300.0 218298.0
- 45 NaN NaN NaN NaN
- 46 NaN NaN NaN NaN
- 47 NaN NaN NaN NaN
- 48 NaN NaN NaN NaN
- 49 NaN NaN NaN NaN
- 50 NaN NaN NaN NaN
- 51 2.0 7.0 100.0 239666.0
- 52 2.0 7.0 200.0 10384.0
- 53 2.0 7.0 300.0 41034.0
- 54 2.0 8.0 100.0 245824.0
- 55 2.0 8.0 200.0 208052.0
- 56 2.0 8.0 300.0 37568.0
- 57 NaN NaN NaN NaN
- 58 NaN NaN NaN NaN
- 59 NaN NaN NaN NaN
- ```
- # Notes
- Ultimately I want to remove these cells from the dataframe. `dropna()`
- excluded from above calls for illustrative purposes.
- I have a dataset showing electrical current and resistance measurements on various cells of different dies. There are multiple measurements for each cell.
- If a cell is ever observed to have resistance <100k while current = 100, that cell is considered a "bad cell". I want to remove all bad cells of that die only (not other dies).
- How can I do this efficiently (without multiple for loops)?
- # Example
- In the dataset below:
- * On die 1, cells 1, 5, 7, 8 are bad and should be removed.
- * On die 2, cells 1, 5, 6, 9 are bad and should be removed.
- * Cells 6, 9 should **not** be removed from die 2 (or others, besides die 1).
- * Cells 7, 8 should **not** be removed from die 1 (or others, besides die 2).
- Tried:
- ```py
- rm_dies = b100["Die"].to_list()
- rm_cells = b100["Cell"].to_list()
- for die, cell in zip(rm_dies, rm_cells):
- df = df.mask((df["Die"] == die) & (df["Cell"] == cell))
- ```
- This works, but is very slow on large dataframes and is not
- elegant.
- ```txt
- Die Cell Current Resistance
- 0 1.0 0.0 100.0 104155.0
- 1 1.0 0.0 200.0 2542.0
- 2 1.0 0.0 300.0 206302.0
- 3 NaN NaN NaN NaN
- 4 NaN NaN NaN NaN
- 5 NaN NaN NaN NaN
- 6 1.0 2.0 100.0 141502.0
- 7 1.0 2.0 200.0 40422.0
- 8 1.0 2.0 300.0 31066.0
- 9 1.0 3.0 100.0 108234.0
- 10 1.0 3.0 200.0 140520.0
- 11 1.0 3.0 300.0 43586.0
- 12 1.0 4.0 100.0 138305.0
- 13 1.0 4.0 200.0 88725.0
- 14 1.0 4.0 300.0 239517.0
- 15 NaN NaN NaN NaN
- 16 NaN NaN NaN NaN
- 17 NaN NaN NaN NaN
- 18 1.0 6.0 100.0 125984.0
- 19 1.0 6.0 200.0 37036.0
- 20 1.0 6.0 300.0 179742.0
- 21 NaN NaN NaN NaN
- 22 NaN NaN NaN NaN
- 23 NaN NaN NaN NaN
- 24 NaN NaN NaN NaN
- 25 NaN NaN NaN NaN
- 26 NaN NaN NaN NaN
- 27 1.0 9.0 100.0 186133.0
- 28 1.0 9.0 200.0 863.0
- 29 1.0 9.0 300.0 235060.0
- 30 2.0 0.0 100.0 217692.0
- 31 2.0 0.0 200.0 192709.0
- 32 2.0 0.0 300.0 44718.0
- 33 NaN NaN NaN NaN
- 34 NaN NaN NaN NaN
- 35 NaN NaN NaN NaN
- 36 2.0 2.0 100.0 144522.0
- 37 2.0 2.0 200.0 184146.0
- 38 2.0 2.0 300.0 58155.0
- 39 2.0 3.0 100.0 130899.0
- 40 2.0 3.0 200.0 177347.0
- 41 2.0 3.0 300.0 206209.0
- 42 2.0 4.0 100.0 201781.0
- 43 2.0 4.0 200.0 58077.0
- 44 2.0 4.0 300.0 218298.0
- 45 NaN NaN NaN NaN
- 46 NaN NaN NaN NaN
- 47 NaN NaN NaN NaN
- 48 NaN NaN NaN NaN
- 49 NaN NaN NaN NaN
- 50 NaN NaN NaN NaN
- 51 2.0 7.0 100.0 239666.0
- 52 2.0 7.0 200.0 10384.0
- 53 2.0 7.0 300.0 41034.0
- 54 2.0 8.0 100.0 245824.0
- 55 2.0 8.0 200.0 208052.0
- 56 2.0 8.0 300.0 37568.0
- 57 NaN NaN NaN NaN
- 58 NaN NaN NaN NaN
- 59 NaN NaN NaN NaN
- ```
- # Notes
- Ultimately I want to remove these cells from the dataframe. `dropna()`
- excluded from above calls for illustrative purposes.
#4: Post edited
Remove entries with two-column ID everywhere, that meet a condition somewhere
- Remove entries by two-column ID everywhere, that meet a condition somewhere
#3: Post edited
- # MWE
- ```py
- import random
- import pandas as pd
- from itertools import product
- random.seed(12345)
- dies = [1, 2]
- cells = list(range(10))
- currents = [100, 200, 300]
- dcc = list(product(dies, cells, currents))
- resistances = random.choices(range(250000 + 1), k=len(dcc))
- df = pd.DataFrame(dcc, columns=["Die", "Cell", "Current"])
- df["Resistance"] = resistances
- b100 = df[(df["Current"] == 100) & (df["Resistance"] < 100000)]
- ```
- ```txt
- df:
- Die Cell Current Resistance
- 0 1 0 100 104155
- 1 1 0 200 2542
- 2 1 0 300 206302
- 3 1 1 100 74660
- 4 1 1 200 92103
- 5 1 1 300 48415
- 6 1 2 100 141502
- 7 1 2 200 40422
- 8 1 2 300 31066
- 9 1 3 100 108234
- 10 1 3 200 140520
- 11 1 3 300 43586
- 12 1 4 100 138305
- 13 1 4 200 88725
- 14 1 4 300 239517
- 15 1 5 100 22823
- 16 1 5 200 244660
- 17 1 5 300 103030
- 18 1 6 100 125984
- 19 1 6 200 37036
- 20 1 6 300 179742
- 21 1 7 100 47493
- 22 1 7 200 85390
- 23 1 7 300 5880
- 24 1 8 100 84879
- 25 1 8 200 241871
- 26 1 8 300 244700
- 27 1 9 100 186133
- 28 1 9 200 863
- 29 1 9 300 235060
- 30 2 0 100 217692
- 31 2 0 200 192709
- 32 2 0 300 44718
- 33 2 1 100 24875
- 34 2 1 200 103633
- 35 2 1 300 221385
- 36 2 2 100 144522
- 37 2 2 200 184146
- 38 2 2 300 58155
- 39 2 3 100 130899
- 40 2 3 200 177347
- 41 2 3 300 206209
- 42 2 4 100 201781
- 43 2 4 200 58077
- 44 2 4 300 218298
- 45 2 5 100 54095
- 46 2 5 200 200475
- 47 2 5 300 138771
- 48 2 6 100 46457
- 49 2 6 200 147152
- 50 2 6 300 129560
- 51 2 7 100 239666
- 52 2 7 200 10384
- 53 2 7 300 41034
- 54 2 8 100 245824
- 55 2 8 200 208052
- 56 2 8 300 37568
- 57 2 9 100 57278
- 58 2 9 200 134785
- 59 2 9 300 39245
- ```
- ```txt
- b100:
- Die Cell Current Resistance
- 3 1 1 100 74660
- 15 1 5 100 22823
- 21 1 7 100 47493
- 24 1 8 100 84879
- 33 2 1 100 24875
- 45 2 5 100 54095
- 48 2 6 100 46457
- 57 2 9 100 57278
- ```
- # Problem
- If a cell is below 100k resistance, at 100 current, I want to remove
- that cell everywhere, within that die. `b100` above shows that I want to
- remove all entries for cells 1, 5, 7, and 8 in die 1, and all entries
- for cells 1, 5, 6, and 9 in die 2.
- Cells 6 and 9 should not be removed from die 1, and cells 7 and 8 should not be removed from die 2.
- How would I do this programatically?
- # Tried
- Tried:
- ```py
- df = df.mask((df["Die"].isin(b100["Die"])) & (df["Cell"].isin(b100["Cell"])))
- ```
- But this removes every cell marked, in either die:
- ```txt
- Die Cell Current Resistance
- 0 1.0 0.0 100.0 104155.0
- 1 1.0 0.0 200.0 2542.0
- 2 1.0 0.0 300.0 206302.0
- 3 NaN NaN NaN NaN
- 4 NaN NaN NaN NaN
- 5 NaN NaN NaN NaN
- 6 1.0 2.0 100.0 141502.0
- 7 1.0 2.0 200.0 40422.0
- 8 1.0 2.0 300.0 31066.0
- 9 1.0 3.0 100.0 108234.0
- 10 1.0 3.0 200.0 140520.0
- 11 1.0 3.0 300.0 43586.0
- 12 1.0 4.0 100.0 138305.0
- 13 1.0 4.0 200.0 88725.0
- 14 1.0 4.0 300.0 239517.0
- 15 NaN NaN NaN NaN
- 16 NaN NaN NaN NaN
- 17 NaN NaN NaN NaN
- 18 NaN NaN NaN NaN
- 19 NaN NaN NaN NaN
- 20 NaN NaN NaN NaN
- 21 NaN NaN NaN NaN
- 22 NaN NaN NaN NaN
- 23 NaN NaN NaN NaN
- 24 NaN NaN NaN NaN
- 25 NaN NaN NaN NaN
- 26 NaN NaN NaN NaN
- 27 NaN NaN NaN NaN
- 28 NaN NaN NaN NaN
- 29 NaN NaN NaN NaN
- 30 2.0 0.0 100.0 217692.0
- 31 2.0 0.0 200.0 192709.0
- 32 2.0 0.0 300.0 44718.0
- 33 NaN NaN NaN NaN
- 34 NaN NaN NaN NaN
- 35 NaN NaN NaN NaN
- 36 2.0 2.0 100.0 144522.0
- 37 2.0 2.0 200.0 184146.0
- 38 2.0 2.0 300.0 58155.0
- 39 2.0 3.0 100.0 130899.0
- 40 2.0 3.0 200.0 177347.0
- 41 2.0 3.0 300.0 206209.0
- 42 2.0 4.0 100.0 201781.0
- 43 2.0 4.0 200.0 58077.0
- 44 2.0 4.0 300.0 218298.0
- 45 NaN NaN NaN NaN
- 46 NaN NaN NaN NaN
- 47 NaN NaN NaN NaN
- 48 NaN NaN NaN NaN
- 49 NaN NaN NaN NaN
- 50 NaN NaN NaN NaN
- 51 NaN NaN NaN NaN
- 52 NaN NaN NaN NaN
- 53 NaN NaN NaN NaN
- 54 NaN NaN NaN NaN
- 55 NaN NaN NaN NaN
- 56 NaN NaN NaN NaN
- 57 NaN NaN NaN NaN
- 58 NaN NaN NaN NaN
- 59 NaN NaN NaN NaN
- ```
- Tried:
- ```py
- rm_dies = b100["Die"].to_list()
- rm_cells = b100["Cell"].to_list()
- for die, cell in zip(rm_dies, rm_cells):
- df = df.mask((df["Die"] == die) & (df["Cell"] == cell))
- ```
This works, but this is very slow on large dataframes and is not- elegant.
- ```txt
- Die Cell Current Resistance
- 0 1.0 0.0 100.0 104155.0
- 1 1.0 0.0 200.0 2542.0
- 2 1.0 0.0 300.0 206302.0
- 3 NaN NaN NaN NaN
- 4 NaN NaN NaN NaN
- 5 NaN NaN NaN NaN
- 6 1.0 2.0 100.0 141502.0
- 7 1.0 2.0 200.0 40422.0
- 8 1.0 2.0 300.0 31066.0
- 9 1.0 3.0 100.0 108234.0
- 10 1.0 3.0 200.0 140520.0
- 11 1.0 3.0 300.0 43586.0
- 12 1.0 4.0 100.0 138305.0
- 13 1.0 4.0 200.0 88725.0
- 14 1.0 4.0 300.0 239517.0
- 15 NaN NaN NaN NaN
- 16 NaN NaN NaN NaN
- 17 NaN NaN NaN NaN
- 18 1.0 6.0 100.0 125984.0
- 19 1.0 6.0 200.0 37036.0
- 20 1.0 6.0 300.0 179742.0
- 21 NaN NaN NaN NaN
- 22 NaN NaN NaN NaN
- 23 NaN NaN NaN NaN
- 24 NaN NaN NaN NaN
- 25 NaN NaN NaN NaN
- 26 NaN NaN NaN NaN
- 27 1.0 9.0 100.0 186133.0
- 28 1.0 9.0 200.0 863.0
- 29 1.0 9.0 300.0 235060.0
- 30 2.0 0.0 100.0 217692.0
- 31 2.0 0.0 200.0 192709.0
- 32 2.0 0.0 300.0 44718.0
- 33 NaN NaN NaN NaN
- 34 NaN NaN NaN NaN
- 35 NaN NaN NaN NaN
- 36 2.0 2.0 100.0 144522.0
- 37 2.0 2.0 200.0 184146.0
- 38 2.0 2.0 300.0 58155.0
- 39 2.0 3.0 100.0 130899.0
- 40 2.0 3.0 200.0 177347.0
- 41 2.0 3.0 300.0 206209.0
- 42 2.0 4.0 100.0 201781.0
- 43 2.0 4.0 200.0 58077.0
- 44 2.0 4.0 300.0 218298.0
- 45 NaN NaN NaN NaN
- 46 NaN NaN NaN NaN
- 47 NaN NaN NaN NaN
- 48 NaN NaN NaN NaN
- 49 NaN NaN NaN NaN
- 50 NaN NaN NaN NaN
- 51 2.0 7.0 100.0 239666.0
- 52 2.0 7.0 200.0 10384.0
- 53 2.0 7.0 300.0 41034.0
- 54 2.0 8.0 100.0 245824.0
- 55 2.0 8.0 200.0 208052.0
- 56 2.0 8.0 300.0 37568.0
- 57 NaN NaN NaN NaN
- 58 NaN NaN NaN NaN
- 59 NaN NaN NaN NaN
- ```
- # Notes
- Ultimately I want to remove these cells from the dataframe. `dropna()`
- excluded from above calls for illustrative purposes.
- # MWE
- ```py
- import random
- import pandas as pd
- from itertools import product
- random.seed(12345)
- dies = [1, 2]
- cells = list(range(10))
- currents = [100, 200, 300]
- dcc = list(product(dies, cells, currents))
- resistances = random.choices(range(250000 + 1), k=len(dcc))
- df = pd.DataFrame(dcc, columns=["Die", "Cell", "Current"])
- df["Resistance"] = resistances
- b100 = df[(df["Current"] == 100) & (df["Resistance"] < 100000)]
- ```
- ```txt
- df:
- Die Cell Current Resistance
- 0 1 0 100 104155
- 1 1 0 200 2542
- 2 1 0 300 206302
- 3 1 1 100 74660
- 4 1 1 200 92103
- 5 1 1 300 48415
- 6 1 2 100 141502
- 7 1 2 200 40422
- 8 1 2 300 31066
- 9 1 3 100 108234
- 10 1 3 200 140520
- 11 1 3 300 43586
- 12 1 4 100 138305
- 13 1 4 200 88725
- 14 1 4 300 239517
- 15 1 5 100 22823
- 16 1 5 200 244660
- 17 1 5 300 103030
- 18 1 6 100 125984
- 19 1 6 200 37036
- 20 1 6 300 179742
- 21 1 7 100 47493
- 22 1 7 200 85390
- 23 1 7 300 5880
- 24 1 8 100 84879
- 25 1 8 200 241871
- 26 1 8 300 244700
- 27 1 9 100 186133
- 28 1 9 200 863
- 29 1 9 300 235060
- 30 2 0 100 217692
- 31 2 0 200 192709
- 32 2 0 300 44718
- 33 2 1 100 24875
- 34 2 1 200 103633
- 35 2 1 300 221385
- 36 2 2 100 144522
- 37 2 2 200 184146
- 38 2 2 300 58155
- 39 2 3 100 130899
- 40 2 3 200 177347
- 41 2 3 300 206209
- 42 2 4 100 201781
- 43 2 4 200 58077
- 44 2 4 300 218298
- 45 2 5 100 54095
- 46 2 5 200 200475
- 47 2 5 300 138771
- 48 2 6 100 46457
- 49 2 6 200 147152
- 50 2 6 300 129560
- 51 2 7 100 239666
- 52 2 7 200 10384
- 53 2 7 300 41034
- 54 2 8 100 245824
- 55 2 8 200 208052
- 56 2 8 300 37568
- 57 2 9 100 57278
- 58 2 9 200 134785
- 59 2 9 300 39245
- ```
- ```txt
- b100:
- Die Cell Current Resistance
- 3 1 1 100 74660
- 15 1 5 100 22823
- 21 1 7 100 47493
- 24 1 8 100 84879
- 33 2 1 100 24875
- 45 2 5 100 54095
- 48 2 6 100 46457
- 57 2 9 100 57278
- ```
- # Problem
- If a cell is below 100k resistance, at 100 current, I want to remove
- that cell everywhere, within that die. `b100` above shows that I want to
- remove all entries for cells 1, 5, 7, and 8 in die 1, and all entries
- for cells 1, 5, 6, and 9 in die 2.
- Cells 6 and 9 should not be removed from die 1, and cells 7 and 8 should not be removed from die 2.
- How would I do this programatically?
- # Tried
- Tried:
- ```py
- df = df.mask((df["Die"].isin(b100["Die"])) & (df["Cell"].isin(b100["Cell"])))
- ```
- But this removes every cell marked, in either die:
- ```txt
- Die Cell Current Resistance
- 0 1.0 0.0 100.0 104155.0
- 1 1.0 0.0 200.0 2542.0
- 2 1.0 0.0 300.0 206302.0
- 3 NaN NaN NaN NaN
- 4 NaN NaN NaN NaN
- 5 NaN NaN NaN NaN
- 6 1.0 2.0 100.0 141502.0
- 7 1.0 2.0 200.0 40422.0
- 8 1.0 2.0 300.0 31066.0
- 9 1.0 3.0 100.0 108234.0
- 10 1.0 3.0 200.0 140520.0
- 11 1.0 3.0 300.0 43586.0
- 12 1.0 4.0 100.0 138305.0
- 13 1.0 4.0 200.0 88725.0
- 14 1.0 4.0 300.0 239517.0
- 15 NaN NaN NaN NaN
- 16 NaN NaN NaN NaN
- 17 NaN NaN NaN NaN
- 18 NaN NaN NaN NaN
- 19 NaN NaN NaN NaN
- 20 NaN NaN NaN NaN
- 21 NaN NaN NaN NaN
- 22 NaN NaN NaN NaN
- 23 NaN NaN NaN NaN
- 24 NaN NaN NaN NaN
- 25 NaN NaN NaN NaN
- 26 NaN NaN NaN NaN
- 27 NaN NaN NaN NaN
- 28 NaN NaN NaN NaN
- 29 NaN NaN NaN NaN
- 30 2.0 0.0 100.0 217692.0
- 31 2.0 0.0 200.0 192709.0
- 32 2.0 0.0 300.0 44718.0
- 33 NaN NaN NaN NaN
- 34 NaN NaN NaN NaN
- 35 NaN NaN NaN NaN
- 36 2.0 2.0 100.0 144522.0
- 37 2.0 2.0 200.0 184146.0
- 38 2.0 2.0 300.0 58155.0
- 39 2.0 3.0 100.0 130899.0
- 40 2.0 3.0 200.0 177347.0
- 41 2.0 3.0 300.0 206209.0
- 42 2.0 4.0 100.0 201781.0
- 43 2.0 4.0 200.0 58077.0
- 44 2.0 4.0 300.0 218298.0
- 45 NaN NaN NaN NaN
- 46 NaN NaN NaN NaN
- 47 NaN NaN NaN NaN
- 48 NaN NaN NaN NaN
- 49 NaN NaN NaN NaN
- 50 NaN NaN NaN NaN
- 51 NaN NaN NaN NaN
- 52 NaN NaN NaN NaN
- 53 NaN NaN NaN NaN
- 54 NaN NaN NaN NaN
- 55 NaN NaN NaN NaN
- 56 NaN NaN NaN NaN
- 57 NaN NaN NaN NaN
- 58 NaN NaN NaN NaN
- 59 NaN NaN NaN NaN
- ```
- Tried:
- ```py
- rm_dies = b100["Die"].to_list()
- rm_cells = b100["Cell"].to_list()
- for die, cell in zip(rm_dies, rm_cells):
- df = df.mask((df["Die"] == die) & (df["Cell"] == cell))
- ```
- This works, but is very slow on large dataframes and is not
- elegant.
- ```txt
- Die Cell Current Resistance
- 0 1.0 0.0 100.0 104155.0
- 1 1.0 0.0 200.0 2542.0
- 2 1.0 0.0 300.0 206302.0
- 3 NaN NaN NaN NaN
- 4 NaN NaN NaN NaN
- 5 NaN NaN NaN NaN
- 6 1.0 2.0 100.0 141502.0
- 7 1.0 2.0 200.0 40422.0
- 8 1.0 2.0 300.0 31066.0
- 9 1.0 3.0 100.0 108234.0
- 10 1.0 3.0 200.0 140520.0
- 11 1.0 3.0 300.0 43586.0
- 12 1.0 4.0 100.0 138305.0
- 13 1.0 4.0 200.0 88725.0
- 14 1.0 4.0 300.0 239517.0
- 15 NaN NaN NaN NaN
- 16 NaN NaN NaN NaN
- 17 NaN NaN NaN NaN
- 18 1.0 6.0 100.0 125984.0
- 19 1.0 6.0 200.0 37036.0
- 20 1.0 6.0 300.0 179742.0
- 21 NaN NaN NaN NaN
- 22 NaN NaN NaN NaN
- 23 NaN NaN NaN NaN
- 24 NaN NaN NaN NaN
- 25 NaN NaN NaN NaN
- 26 NaN NaN NaN NaN
- 27 1.0 9.0 100.0 186133.0
- 28 1.0 9.0 200.0 863.0
- 29 1.0 9.0 300.0 235060.0
- 30 2.0 0.0 100.0 217692.0
- 31 2.0 0.0 200.0 192709.0
- 32 2.0 0.0 300.0 44718.0
- 33 NaN NaN NaN NaN
- 34 NaN NaN NaN NaN
- 35 NaN NaN NaN NaN
- 36 2.0 2.0 100.0 144522.0
- 37 2.0 2.0 200.0 184146.0
- 38 2.0 2.0 300.0 58155.0
- 39 2.0 3.0 100.0 130899.0
- 40 2.0 3.0 200.0 177347.0
- 41 2.0 3.0 300.0 206209.0
- 42 2.0 4.0 100.0 201781.0
- 43 2.0 4.0 200.0 58077.0
- 44 2.0 4.0 300.0 218298.0
- 45 NaN NaN NaN NaN
- 46 NaN NaN NaN NaN
- 47 NaN NaN NaN NaN
- 48 NaN NaN NaN NaN
- 49 NaN NaN NaN NaN
- 50 NaN NaN NaN NaN
- 51 2.0 7.0 100.0 239666.0
- 52 2.0 7.0 200.0 10384.0
- 53 2.0 7.0 300.0 41034.0
- 54 2.0 8.0 100.0 245824.0
- 55 2.0 8.0 200.0 208052.0
- 56 2.0 8.0 300.0 37568.0
- 57 NaN NaN NaN NaN
- 58 NaN NaN NaN NaN
- 59 NaN NaN NaN NaN
- ```
- # Notes
- Ultimately I want to remove these cells from the dataframe. `dropna()`
- excluded from above calls for illustrative purposes.
#2: Post edited
- # MWE
- ```py
- import random
- import pandas as pd
- from itertools import product
- random.seed(12345)
- dies = [1, 2]
- cells = list(range(10))
- currents = [100, 200, 300]
- dcc = list(product(dies, cells, currents))
- resistances = random.choices(range(250000 + 1), k=len(dcc))
- df = pd.DataFrame(dcc, columns=["Die", "Cell", "Current"])
- df["Resistance"] = resistances
- b100 = df[(df["Current"] == 100) & (df["Resistance"] < 100000)]
- ```
- ```txt
- df:
- Die Cell Current Resistance
- 0 1 0 100 104155
- 1 1 0 200 2542
- 2 1 0 300 206302
- 3 1 1 100 74660
- 4 1 1 200 92103
- 5 1 1 300 48415
- 6 1 2 100 141502
- 7 1 2 200 40422
- 8 1 2 300 31066
- 9 1 3 100 108234
- 10 1 3 200 140520
- 11 1 3 300 43586
- 12 1 4 100 138305
- 13 1 4 200 88725
- 14 1 4 300 239517
- 15 1 5 100 22823
- 16 1 5 200 244660
- 17 1 5 300 103030
- 18 1 6 100 125984
- 19 1 6 200 37036
- 20 1 6 300 179742
- 21 1 7 100 47493
- 22 1 7 200 85390
- 23 1 7 300 5880
- 24 1 8 100 84879
- 25 1 8 200 241871
- 26 1 8 300 244700
- 27 1 9 100 186133
- 28 1 9 200 863
- 29 1 9 300 235060
- 30 2 0 100 217692
- 31 2 0 200 192709
- 32 2 0 300 44718
- 33 2 1 100 24875
- 34 2 1 200 103633
- 35 2 1 300 221385
- 36 2 2 100 144522
- 37 2 2 200 184146
- 38 2 2 300 58155
- 39 2 3 100 130899
- 40 2 3 200 177347
- 41 2 3 300 206209
- 42 2 4 100 201781
- 43 2 4 200 58077
- 44 2 4 300 218298
- 45 2 5 100 54095
- 46 2 5 200 200475
- 47 2 5 300 138771
- 48 2 6 100 46457
- 49 2 6 200 147152
- 50 2 6 300 129560
- 51 2 7 100 239666
- 52 2 7 200 10384
- 53 2 7 300 41034
- 54 2 8 100 245824
- 55 2 8 200 208052
- 56 2 8 300 37568
- 57 2 9 100 57278
- 58 2 9 200 134785
- 59 2 9 300 39245
- ```
- ```txt
- b100:
- Die Cell Current Resistance
- 3 1 1 100 74660
- 15 1 5 100 22823
- 21 1 7 100 47493
- 24 1 8 100 84879
- 33 2 1 100 24875
- 45 2 5 100 54095
- 48 2 6 100 46457
- 57 2 9 100 57278
- ```
- # Problem
- If a cell is below 100k resistance, at 100 current, I want to remove
- that cell everywhere, within that die. `b100` above shows that I want to
- remove all entries for cells 1, 5, 7, and 8 in die 1, and all entries
- for cells 1, 5, 6, and 9 in die 2.
Cells 7 and 8 should not be removed from die 2, and cells 6 and 9 shouldnot be removed from die 1.- How would I do this programatically?
- # Tried
- Tried:
- ```py
- df = df.mask((df["Die"].isin(b100["Die"])) & (df["Cell"].isin(b100["Cell"])))
- ```
- But this removes every cell marked, in either die:
- ```txt
- Die Cell Current Resistance
- 0 1.0 0.0 100.0 104155.0
- 1 1.0 0.0 200.0 2542.0
- 2 1.0 0.0 300.0 206302.0
- 3 NaN NaN NaN NaN
- 4 NaN NaN NaN NaN
- 5 NaN NaN NaN NaN
- 6 1.0 2.0 100.0 141502.0
- 7 1.0 2.0 200.0 40422.0
- 8 1.0 2.0 300.0 31066.0
- 9 1.0 3.0 100.0 108234.0
- 10 1.0 3.0 200.0 140520.0
- 11 1.0 3.0 300.0 43586.0
- 12 1.0 4.0 100.0 138305.0
- 13 1.0 4.0 200.0 88725.0
- 14 1.0 4.0 300.0 239517.0
- 15 NaN NaN NaN NaN
- 16 NaN NaN NaN NaN
- 17 NaN NaN NaN NaN
- 18 NaN NaN NaN NaN
- 19 NaN NaN NaN NaN
- 20 NaN NaN NaN NaN
- 21 NaN NaN NaN NaN
- 22 NaN NaN NaN NaN
- 23 NaN NaN NaN NaN
- 24 NaN NaN NaN NaN
- 25 NaN NaN NaN NaN
- 26 NaN NaN NaN NaN
- 27 NaN NaN NaN NaN
- 28 NaN NaN NaN NaN
- 29 NaN NaN NaN NaN
- 30 2.0 0.0 100.0 217692.0
- 31 2.0 0.0 200.0 192709.0
- 32 2.0 0.0 300.0 44718.0
- 33 NaN NaN NaN NaN
- 34 NaN NaN NaN NaN
- 35 NaN NaN NaN NaN
- 36 2.0 2.0 100.0 144522.0
- 37 2.0 2.0 200.0 184146.0
- 38 2.0 2.0 300.0 58155.0
- 39 2.0 3.0 100.0 130899.0
- 40 2.0 3.0 200.0 177347.0
- 41 2.0 3.0 300.0 206209.0
- 42 2.0 4.0 100.0 201781.0
- 43 2.0 4.0 200.0 58077.0
- 44 2.0 4.0 300.0 218298.0
- 45 NaN NaN NaN NaN
- 46 NaN NaN NaN NaN
- 47 NaN NaN NaN NaN
- 48 NaN NaN NaN NaN
- 49 NaN NaN NaN NaN
- 50 NaN NaN NaN NaN
- 51 NaN NaN NaN NaN
- 52 NaN NaN NaN NaN
- 53 NaN NaN NaN NaN
- 54 NaN NaN NaN NaN
- 55 NaN NaN NaN NaN
- 56 NaN NaN NaN NaN
- 57 NaN NaN NaN NaN
- 58 NaN NaN NaN NaN
- 59 NaN NaN NaN NaN
- ```
- Tried:
- ```py
- rm_dies = b100["Die"].to_list()
- rm_cells = b100["Cell"].to_list()
- for die, cell in zip(rm_dies, rm_cells):
- df = df.mask((df["Die"] == die) & (df["Cell"] == cell))
- ```
- This works, but this is very slow on large dataframes and is not
- elegant.
- ```txt
- Die Cell Current Resistance
- 0 1.0 0.0 100.0 104155.0
- 1 1.0 0.0 200.0 2542.0
- 2 1.0 0.0 300.0 206302.0
- 3 NaN NaN NaN NaN
- 4 NaN NaN NaN NaN
- 5 NaN NaN NaN NaN
- 6 1.0 2.0 100.0 141502.0
- 7 1.0 2.0 200.0 40422.0
- 8 1.0 2.0 300.0 31066.0
- 9 1.0 3.0 100.0 108234.0
- 10 1.0 3.0 200.0 140520.0
- 11 1.0 3.0 300.0 43586.0
- 12 1.0 4.0 100.0 138305.0
- 13 1.0 4.0 200.0 88725.0
- 14 1.0 4.0 300.0 239517.0
- 15 NaN NaN NaN NaN
- 16 NaN NaN NaN NaN
- 17 NaN NaN NaN NaN
- 18 1.0 6.0 100.0 125984.0
- 19 1.0 6.0 200.0 37036.0
- 20 1.0 6.0 300.0 179742.0
- 21 NaN NaN NaN NaN
- 22 NaN NaN NaN NaN
- 23 NaN NaN NaN NaN
- 24 NaN NaN NaN NaN
- 25 NaN NaN NaN NaN
- 26 NaN NaN NaN NaN
- 27 1.0 9.0 100.0 186133.0
- 28 1.0 9.0 200.0 863.0
- 29 1.0 9.0 300.0 235060.0
- 30 2.0 0.0 100.0 217692.0
- 31 2.0 0.0 200.0 192709.0
- 32 2.0 0.0 300.0 44718.0
- 33 NaN NaN NaN NaN
- 34 NaN NaN NaN NaN
- 35 NaN NaN NaN NaN
- 36 2.0 2.0 100.0 144522.0
- 37 2.0 2.0 200.0 184146.0
- 38 2.0 2.0 300.0 58155.0
- 39 2.0 3.0 100.0 130899.0
- 40 2.0 3.0 200.0 177347.0
- 41 2.0 3.0 300.0 206209.0
- 42 2.0 4.0 100.0 201781.0
- 43 2.0 4.0 200.0 58077.0
- 44 2.0 4.0 300.0 218298.0
- 45 NaN NaN NaN NaN
- 46 NaN NaN NaN NaN
- 47 NaN NaN NaN NaN
- 48 NaN NaN NaN NaN
- 49 NaN NaN NaN NaN
- 50 NaN NaN NaN NaN
- 51 2.0 7.0 100.0 239666.0
- 52 2.0 7.0 200.0 10384.0
- 53 2.0 7.0 300.0 41034.0
- 54 2.0 8.0 100.0 245824.0
- 55 2.0 8.0 200.0 208052.0
- 56 2.0 8.0 300.0 37568.0
- 57 NaN NaN NaN NaN
- 58 NaN NaN NaN NaN
- 59 NaN NaN NaN NaN
- ```
- # Notes
- Ultimately I want to remove these cells from the dataframe. `dropna()`
- excluded from above calls for illustrative purposes.
- # MWE
- ```py
- import random
- import pandas as pd
- from itertools import product
- random.seed(12345)
- dies = [1, 2]
- cells = list(range(10))
- currents = [100, 200, 300]
- dcc = list(product(dies, cells, currents))
- resistances = random.choices(range(250000 + 1), k=len(dcc))
- df = pd.DataFrame(dcc, columns=["Die", "Cell", "Current"])
- df["Resistance"] = resistances
- b100 = df[(df["Current"] == 100) & (df["Resistance"] < 100000)]
- ```
- ```txt
- df:
- Die Cell Current Resistance
- 0 1 0 100 104155
- 1 1 0 200 2542
- 2 1 0 300 206302
- 3 1 1 100 74660
- 4 1 1 200 92103
- 5 1 1 300 48415
- 6 1 2 100 141502
- 7 1 2 200 40422
- 8 1 2 300 31066
- 9 1 3 100 108234
- 10 1 3 200 140520
- 11 1 3 300 43586
- 12 1 4 100 138305
- 13 1 4 200 88725
- 14 1 4 300 239517
- 15 1 5 100 22823
- 16 1 5 200 244660
- 17 1 5 300 103030
- 18 1 6 100 125984
- 19 1 6 200 37036
- 20 1 6 300 179742
- 21 1 7 100 47493
- 22 1 7 200 85390
- 23 1 7 300 5880
- 24 1 8 100 84879
- 25 1 8 200 241871
- 26 1 8 300 244700
- 27 1 9 100 186133
- 28 1 9 200 863
- 29 1 9 300 235060
- 30 2 0 100 217692
- 31 2 0 200 192709
- 32 2 0 300 44718
- 33 2 1 100 24875
- 34 2 1 200 103633
- 35 2 1 300 221385
- 36 2 2 100 144522
- 37 2 2 200 184146
- 38 2 2 300 58155
- 39 2 3 100 130899
- 40 2 3 200 177347
- 41 2 3 300 206209
- 42 2 4 100 201781
- 43 2 4 200 58077
- 44 2 4 300 218298
- 45 2 5 100 54095
- 46 2 5 200 200475
- 47 2 5 300 138771
- 48 2 6 100 46457
- 49 2 6 200 147152
- 50 2 6 300 129560
- 51 2 7 100 239666
- 52 2 7 200 10384
- 53 2 7 300 41034
- 54 2 8 100 245824
- 55 2 8 200 208052
- 56 2 8 300 37568
- 57 2 9 100 57278
- 58 2 9 200 134785
- 59 2 9 300 39245
- ```
- ```txt
- b100:
- Die Cell Current Resistance
- 3 1 1 100 74660
- 15 1 5 100 22823
- 21 1 7 100 47493
- 24 1 8 100 84879
- 33 2 1 100 24875
- 45 2 5 100 54095
- 48 2 6 100 46457
- 57 2 9 100 57278
- ```
- # Problem
- If a cell is below 100k resistance, at 100 current, I want to remove
- that cell everywhere, within that die. `b100` above shows that I want to
- remove all entries for cells 1, 5, 7, and 8 in die 1, and all entries
- for cells 1, 5, 6, and 9 in die 2.
- Cells 6 and 9 should not be removed from die 1, and cells 7 and 8 should not be removed from die 2.
- How would I do this programatically?
- # Tried
- Tried:
- ```py
- df = df.mask((df["Die"].isin(b100["Die"])) & (df["Cell"].isin(b100["Cell"])))
- ```
- But this removes every cell marked, in either die:
- ```txt
- Die Cell Current Resistance
- 0 1.0 0.0 100.0 104155.0
- 1 1.0 0.0 200.0 2542.0
- 2 1.0 0.0 300.0 206302.0
- 3 NaN NaN NaN NaN
- 4 NaN NaN NaN NaN
- 5 NaN NaN NaN NaN
- 6 1.0 2.0 100.0 141502.0
- 7 1.0 2.0 200.0 40422.0
- 8 1.0 2.0 300.0 31066.0
- 9 1.0 3.0 100.0 108234.0
- 10 1.0 3.0 200.0 140520.0
- 11 1.0 3.0 300.0 43586.0
- 12 1.0 4.0 100.0 138305.0
- 13 1.0 4.0 200.0 88725.0
- 14 1.0 4.0 300.0 239517.0
- 15 NaN NaN NaN NaN
- 16 NaN NaN NaN NaN
- 17 NaN NaN NaN NaN
- 18 NaN NaN NaN NaN
- 19 NaN NaN NaN NaN
- 20 NaN NaN NaN NaN
- 21 NaN NaN NaN NaN
- 22 NaN NaN NaN NaN
- 23 NaN NaN NaN NaN
- 24 NaN NaN NaN NaN
- 25 NaN NaN NaN NaN
- 26 NaN NaN NaN NaN
- 27 NaN NaN NaN NaN
- 28 NaN NaN NaN NaN
- 29 NaN NaN NaN NaN
- 30 2.0 0.0 100.0 217692.0
- 31 2.0 0.0 200.0 192709.0
- 32 2.0 0.0 300.0 44718.0
- 33 NaN NaN NaN NaN
- 34 NaN NaN NaN NaN
- 35 NaN NaN NaN NaN
- 36 2.0 2.0 100.0 144522.0
- 37 2.0 2.0 200.0 184146.0
- 38 2.0 2.0 300.0 58155.0
- 39 2.0 3.0 100.0 130899.0
- 40 2.0 3.0 200.0 177347.0
- 41 2.0 3.0 300.0 206209.0
- 42 2.0 4.0 100.0 201781.0
- 43 2.0 4.0 200.0 58077.0
- 44 2.0 4.0 300.0 218298.0
- 45 NaN NaN NaN NaN
- 46 NaN NaN NaN NaN
- 47 NaN NaN NaN NaN
- 48 NaN NaN NaN NaN
- 49 NaN NaN NaN NaN
- 50 NaN NaN NaN NaN
- 51 NaN NaN NaN NaN
- 52 NaN NaN NaN NaN
- 53 NaN NaN NaN NaN
- 54 NaN NaN NaN NaN
- 55 NaN NaN NaN NaN
- 56 NaN NaN NaN NaN
- 57 NaN NaN NaN NaN
- 58 NaN NaN NaN NaN
- 59 NaN NaN NaN NaN
- ```
- Tried:
- ```py
- rm_dies = b100["Die"].to_list()
- rm_cells = b100["Cell"].to_list()
- for die, cell in zip(rm_dies, rm_cells):
- df = df.mask((df["Die"] == die) & (df["Cell"] == cell))
- ```
- This works, but this is very slow on large dataframes and is not
- elegant.
- ```txt
- Die Cell Current Resistance
- 0 1.0 0.0 100.0 104155.0
- 1 1.0 0.0 200.0 2542.0
- 2 1.0 0.0 300.0 206302.0
- 3 NaN NaN NaN NaN
- 4 NaN NaN NaN NaN
- 5 NaN NaN NaN NaN
- 6 1.0 2.0 100.0 141502.0
- 7 1.0 2.0 200.0 40422.0
- 8 1.0 2.0 300.0 31066.0
- 9 1.0 3.0 100.0 108234.0
- 10 1.0 3.0 200.0 140520.0
- 11 1.0 3.0 300.0 43586.0
- 12 1.0 4.0 100.0 138305.0
- 13 1.0 4.0 200.0 88725.0
- 14 1.0 4.0 300.0 239517.0
- 15 NaN NaN NaN NaN
- 16 NaN NaN NaN NaN
- 17 NaN NaN NaN NaN
- 18 1.0 6.0 100.0 125984.0
- 19 1.0 6.0 200.0 37036.0
- 20 1.0 6.0 300.0 179742.0
- 21 NaN NaN NaN NaN
- 22 NaN NaN NaN NaN
- 23 NaN NaN NaN NaN
- 24 NaN NaN NaN NaN
- 25 NaN NaN NaN NaN
- 26 NaN NaN NaN NaN
- 27 1.0 9.0 100.0 186133.0
- 28 1.0 9.0 200.0 863.0
- 29 1.0 9.0 300.0 235060.0
- 30 2.0 0.0 100.0 217692.0
- 31 2.0 0.0 200.0 192709.0
- 32 2.0 0.0 300.0 44718.0
- 33 NaN NaN NaN NaN
- 34 NaN NaN NaN NaN
- 35 NaN NaN NaN NaN
- 36 2.0 2.0 100.0 144522.0
- 37 2.0 2.0 200.0 184146.0
- 38 2.0 2.0 300.0 58155.0
- 39 2.0 3.0 100.0 130899.0
- 40 2.0 3.0 200.0 177347.0
- 41 2.0 3.0 300.0 206209.0
- 42 2.0 4.0 100.0 201781.0
- 43 2.0 4.0 200.0 58077.0
- 44 2.0 4.0 300.0 218298.0
- 45 NaN NaN NaN NaN
- 46 NaN NaN NaN NaN
- 47 NaN NaN NaN NaN
- 48 NaN NaN NaN NaN
- 49 NaN NaN NaN NaN
- 50 NaN NaN NaN NaN
- 51 2.0 7.0 100.0 239666.0
- 52 2.0 7.0 200.0 10384.0
- 53 2.0 7.0 300.0 41034.0
- 54 2.0 8.0 100.0 245824.0
- 55 2.0 8.0 200.0 208052.0
- 56 2.0 8.0 300.0 37568.0
- 57 NaN NaN NaN NaN
- 58 NaN NaN NaN NaN
- 59 NaN NaN NaN NaN
- ```
- # Notes
- Ultimately I want to remove these cells from the dataframe. `dropna()`
- excluded from above calls for illustrative purposes.
#1: Initial revision
Remove entries with two-column ID everywhere, that meet a condition somewhere
# MWE ```py import random import pandas as pd from itertools import product random.seed(12345) dies = [1, 2] cells = list(range(10)) currents = [100, 200, 300] dcc = list(product(dies, cells, currents)) resistances = random.choices(range(250000 + 1), k=len(dcc)) df = pd.DataFrame(dcc, columns=["Die", "Cell", "Current"]) df["Resistance"] = resistances b100 = df[(df["Current"] == 100) & (df["Resistance"] < 100000)] ``` ```txt df: Die Cell Current Resistance 0 1 0 100 104155 1 1 0 200 2542 2 1 0 300 206302 3 1 1 100 74660 4 1 1 200 92103 5 1 1 300 48415 6 1 2 100 141502 7 1 2 200 40422 8 1 2 300 31066 9 1 3 100 108234 10 1 3 200 140520 11 1 3 300 43586 12 1 4 100 138305 13 1 4 200 88725 14 1 4 300 239517 15 1 5 100 22823 16 1 5 200 244660 17 1 5 300 103030 18 1 6 100 125984 19 1 6 200 37036 20 1 6 300 179742 21 1 7 100 47493 22 1 7 200 85390 23 1 7 300 5880 24 1 8 100 84879 25 1 8 200 241871 26 1 8 300 244700 27 1 9 100 186133 28 1 9 200 863 29 1 9 300 235060 30 2 0 100 217692 31 2 0 200 192709 32 2 0 300 44718 33 2 1 100 24875 34 2 1 200 103633 35 2 1 300 221385 36 2 2 100 144522 37 2 2 200 184146 38 2 2 300 58155 39 2 3 100 130899 40 2 3 200 177347 41 2 3 300 206209 42 2 4 100 201781 43 2 4 200 58077 44 2 4 300 218298 45 2 5 100 54095 46 2 5 200 200475 47 2 5 300 138771 48 2 6 100 46457 49 2 6 200 147152 50 2 6 300 129560 51 2 7 100 239666 52 2 7 200 10384 53 2 7 300 41034 54 2 8 100 245824 55 2 8 200 208052 56 2 8 300 37568 57 2 9 100 57278 58 2 9 200 134785 59 2 9 300 39245 ``` ```txt b100: Die Cell Current Resistance 3 1 1 100 74660 15 1 5 100 22823 21 1 7 100 47493 24 1 8 100 84879 33 2 1 100 24875 45 2 5 100 54095 48 2 6 100 46457 57 2 9 100 57278 ``` # Problem If a cell is below 100k resistance, at 100 current, I want to remove that cell everywhere, within that die. `b100` above shows that I want to remove all entries for cells 1, 5, 7, and 8 in die 1, and all entries for cells 1, 5, 6, and 9 in die 2. Cells 7 and 8 should not be removed from die 2, and cells 6 and 9 should not be removed from die 1. How would I do this programatically? # Tried Tried: ```py df = df.mask((df["Die"].isin(b100["Die"])) & (df["Cell"].isin(b100["Cell"]))) ``` But this removes every cell marked, in either die: ```txt Die Cell Current Resistance 0 1.0 0.0 100.0 104155.0 1 1.0 0.0 200.0 2542.0 2 1.0 0.0 300.0 206302.0 3 NaN NaN NaN NaN 4 NaN NaN NaN NaN 5 NaN NaN NaN NaN 6 1.0 2.0 100.0 141502.0 7 1.0 2.0 200.0 40422.0 8 1.0 2.0 300.0 31066.0 9 1.0 3.0 100.0 108234.0 10 1.0 3.0 200.0 140520.0 11 1.0 3.0 300.0 43586.0 12 1.0 4.0 100.0 138305.0 13 1.0 4.0 200.0 88725.0 14 1.0 4.0 300.0 239517.0 15 NaN NaN NaN NaN 16 NaN NaN NaN NaN 17 NaN NaN NaN NaN 18 NaN NaN NaN NaN 19 NaN NaN NaN NaN 20 NaN NaN NaN NaN 21 NaN NaN NaN NaN 22 NaN NaN NaN NaN 23 NaN NaN NaN NaN 24 NaN NaN NaN NaN 25 NaN NaN NaN NaN 26 NaN NaN NaN NaN 27 NaN NaN NaN NaN 28 NaN NaN NaN NaN 29 NaN NaN NaN NaN 30 2.0 0.0 100.0 217692.0 31 2.0 0.0 200.0 192709.0 32 2.0 0.0 300.0 44718.0 33 NaN NaN NaN NaN 34 NaN NaN NaN NaN 35 NaN NaN NaN NaN 36 2.0 2.0 100.0 144522.0 37 2.0 2.0 200.0 184146.0 38 2.0 2.0 300.0 58155.0 39 2.0 3.0 100.0 130899.0 40 2.0 3.0 200.0 177347.0 41 2.0 3.0 300.0 206209.0 42 2.0 4.0 100.0 201781.0 43 2.0 4.0 200.0 58077.0 44 2.0 4.0 300.0 218298.0 45 NaN NaN NaN NaN 46 NaN NaN NaN NaN 47 NaN NaN NaN NaN 48 NaN NaN NaN NaN 49 NaN NaN NaN NaN 50 NaN NaN NaN NaN 51 NaN NaN NaN NaN 52 NaN NaN NaN NaN 53 NaN NaN NaN NaN 54 NaN NaN NaN NaN 55 NaN NaN NaN NaN 56 NaN NaN NaN NaN 57 NaN NaN NaN NaN 58 NaN NaN NaN NaN 59 NaN NaN NaN NaN ``` Tried: ```py rm_dies = b100["Die"].to_list() rm_cells = b100["Cell"].to_list() for die, cell in zip(rm_dies, rm_cells): df = df.mask((df["Die"] == die) & (df["Cell"] == cell)) ``` This works, but this is very slow on large dataframes and is not elegant. ```txt Die Cell Current Resistance 0 1.0 0.0 100.0 104155.0 1 1.0 0.0 200.0 2542.0 2 1.0 0.0 300.0 206302.0 3 NaN NaN NaN NaN 4 NaN NaN NaN NaN 5 NaN NaN NaN NaN 6 1.0 2.0 100.0 141502.0 7 1.0 2.0 200.0 40422.0 8 1.0 2.0 300.0 31066.0 9 1.0 3.0 100.0 108234.0 10 1.0 3.0 200.0 140520.0 11 1.0 3.0 300.0 43586.0 12 1.0 4.0 100.0 138305.0 13 1.0 4.0 200.0 88725.0 14 1.0 4.0 300.0 239517.0 15 NaN NaN NaN NaN 16 NaN NaN NaN NaN 17 NaN NaN NaN NaN 18 1.0 6.0 100.0 125984.0 19 1.0 6.0 200.0 37036.0 20 1.0 6.0 300.0 179742.0 21 NaN NaN NaN NaN 22 NaN NaN NaN NaN 23 NaN NaN NaN NaN 24 NaN NaN NaN NaN 25 NaN NaN NaN NaN 26 NaN NaN NaN NaN 27 1.0 9.0 100.0 186133.0 28 1.0 9.0 200.0 863.0 29 1.0 9.0 300.0 235060.0 30 2.0 0.0 100.0 217692.0 31 2.0 0.0 200.0 192709.0 32 2.0 0.0 300.0 44718.0 33 NaN NaN NaN NaN 34 NaN NaN NaN NaN 35 NaN NaN NaN NaN 36 2.0 2.0 100.0 144522.0 37 2.0 2.0 200.0 184146.0 38 2.0 2.0 300.0 58155.0 39 2.0 3.0 100.0 130899.0 40 2.0 3.0 200.0 177347.0 41 2.0 3.0 300.0 206209.0 42 2.0 4.0 100.0 201781.0 43 2.0 4.0 200.0 58077.0 44 2.0 4.0 300.0 218298.0 45 NaN NaN NaN NaN 46 NaN NaN NaN NaN 47 NaN NaN NaN NaN 48 NaN NaN NaN NaN 49 NaN NaN NaN NaN 50 NaN NaN NaN NaN 51 2.0 7.0 100.0 239666.0 52 2.0 7.0 200.0 10384.0 53 2.0 7.0 300.0 41034.0 54 2.0 8.0 100.0 245824.0 55 2.0 8.0 200.0 208052.0 56 2.0 8.0 300.0 37568.0 57 NaN NaN NaN NaN 58 NaN NaN NaN NaN 59 NaN NaN NaN NaN ``` # Notes Ultimately I want to remove these cells from the dataframe. `dropna()` excluded from above calls for illustrative purposes.