1. index: 2020 https://stackoverflow.com/questions/20119414/define-aggfunc-for-each-values-column-in-pandas-pivot-table Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 0 1 0 0 0 0 0 1 0 1 1 0.2 Function 0 0 0 0 0 0 0 0 0 0 0 0 A1 0 0 1 0 0 1 0 0 0 0 1 0.2 A2 1 0 0 1 1 0 0 1 0 0 1 0.4 A3 1 0 0 0 1 0 1 0 1 0 1 0.4 Origin: Problem: Was trying to generate a pivot table with multiple "values" columns. I know I can use aggfunc to aggregate values the way I want to, but what if I don't want to sum or avg both columns but instead I want sum of one column while mean of the other one. So is it possible to do so using pandas? df = pd.DataFrame({ 'A' : ['one', 'one', 'two', 'three'] * 6, 'B' : ['A', 'B', 'C'] * 8, 'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 4, 'D' : np.random.arange(24), 'E' : np.random.arange(24) }) Now this will get a pivot table with sum: pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=np.sum) And this for mean: pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=np.mean) How can I get sum for D and mean for E? Hope my question is clear enough. A: import pandas as pd import numpy as np df = pd.DataFrame({ 'A' : ['one', 'one', 'two', 'three'] * 6, 'B' : ['A', 'B', 'C'] * 8, 'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 4, 'D' : np.random.randn(24), 'E' : np.random.randn(24) }) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): return pd.pivot_table(df, values=['D','E'], index=['B'], aggfunc={'D':np.sum, 'E':np.mean}) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) Function: Problem: Was trying to generate a pivot table with multiple "values" columns. I know I can use aggfunc to aggregate values the way I want to, but what if I don't want to sum or avg both columns but instead I want sum of one column while mean of the other one. So is it possible to do so using pandas? df = pd.DataFrame({ 'A' : ['one', 'one', 'two', 'three'] * 6, 'B' : ['A', 'B', 'C'] * 8, 'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 4, 'D' : np.random.arange(24), 'E' : np.random.arange(24) }) Now this will get a pivot table with sum: pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=np.sum) And this for mean: pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=np.mean) How can I get sum for D and mean for E? Hope my question is clear enough. A: import pandas as pd import numpy as np def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return result Test: def g(df): return pd.pivot_table(df, values=['D','E'], index=['B'], aggfunc={'D':np.sum, 'E':np.mean}) ### test1 df = pd.DataFrame({ 'A' : ['one', 'one', 'two', 'three'] * 6, 'B' : ['A', 'B', 'C'] * 8, 'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 4, 'D' : np.random.randn(24), 'E' : np.random.randn(24) }) print(f(df.copy())) print(pd.testing.assert_frame_equal(g(df.copy()), f(df.copy()), check_dtype=False)) A1: Problem: I have a dataframe: df = pd.DataFrame({ 'A' : ['one', 'one', 'two', 'three'] * 6, 'B' : ['A', 'B', 'C'] * 8, 'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 4, 'D' : np.random.arange(24), 'E' : np.random.arange(24) }) Now this will get a pivot table with sum: pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=np.sum) And this for mean: pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=np.mean) How can I get sum for D and mean for E? A: import pandas as pd import numpy as np df = pd.DataFrame({ 'A' : ['one', 'one', 'two', 'three'] * 6, 'B' : ['A', 'B', 'C'] * 8, 'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 4, 'D' : np.random.randn(24), 'E' : np.random.randn(24) }) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): return pd.pivot_table(df, values=['D','E'], index=['B'], aggfunc={'D':np.sum, 'E':np.mean}) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) A2: Problem: Was trying to generate a pivot table with multiple "values" columns. I know I can use aggfunc to aggregate values the way I want to, but what if I don't want to sum or avg both columns but instead I want sum of one column while mean of the other one. So is it possible to do so using pandas? df = pd.DataFrame({ 'A' : ['abc', 'def', 'xyz', 'abc'] * 3, 'B' : ['A', 'B', 'C'] * 4, 'D' : np.random.arange(12), 'E' : np.random.arange(12) }) Now this will get a pivot table with sum: pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=np.sum) And this for mean: pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=np.mean) How can I get sum for D and mean for E? Hope my question is clear enough. A: import pandas as pd import numpy as np df = pd.DataFrame({ 'A' : ['abc', 'def', 'xyz', 'abc'] * 3, 'B' : ['A', 'B', 'C'] * 4, 'D' : np.random.arange(12), 'E' : np.random.arange(12) }) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): return pd.pivot_table(df, values=['D','E'], index=['B'], aggfunc={'D':np.sum, 'E':np.mean}) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) A3: Problem: Was trying to generate a pivot table with multiple "values" columns. I know I can use aggfunc to aggregate values the way I want to, but what if I don't want to sum or avg both columns but instead I want max of one column while min of the other one. So is it possible to do so using pandas? df = pd.DataFrame({ 'A' : ['one', 'one', 'two', 'three'] * 6, 'B' : ['A', 'B', 'C'] * 8, 'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 4, 'D' : np.random.arange(24), 'E' : np.random.arange(24) }) Now this will get a pivot table with max: pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=np.max) And this for min: pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=np.min) How can I get max for D and min for E? Hope my question is clear enough. A: import pandas as pd import numpy as np df = pd.DataFrame({ 'A' : ['one', 'one', 'two', 'three'] * 6, 'B' : ['A', 'B', 'C'] * 8, 'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 4, 'D' : np.random.randn(24), 'E' : np.random.randn(24) }) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): return pd.pivot_table(df, values=['D','E'], index=['B'], aggfunc={'D':np.max, 'E':np.min}) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) 2. index: 37 https://stackoverflow.com/questions/20119414/define-aggfunc-for-each-values-column-in-pandas-pivot-table Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin Function A1 A2 A3 Origin: I want to apply my custom function (it uses an if-else ladder) to these six columns (ERI_Hispanic, ERI_AmerInd_AKNatv, ERI_Asian, ERI_Black_Afr.Amer, ERI_HI_PacIsl, ERI_White) in each row of my dataframe. I've tried different methods from other questions but still can't seem to find the right answer for my problem. The critical piece of this is that if the person is counted as Hispanic they can't be counted as anything else. Even if they have a "1" in another ethnicity column they still are counted as Hispanic not two or more races. Similarly, if the sum of all the ERI columns is greater than 1 they are counted as two or more races and can't be counted as a unique ethnicity(except for Hispanic). Hopefully this makes sense. Any help will be greatly appreciated. Its almost like doing a for loop through each row and if each record meets a criterion they are added to one list and eliminated from the original. From the dataframe below I need to calculate a new column based on the following spec in SQL: CRITERIA IF [ERI_Hispanic] = 1 THEN RETURN “Hispanic” ELSE IF SUM([ERI_AmerInd_AKNatv] + [ERI_Asian] + [ERI_Black_Afr.Amer] + [ERI_HI_PacIsl] + [ERI_White]) > 1 THEN RETURN “Two or More” ELSE IF [ERI_AmerInd_AKNatv] = 1 THEN RETURN “A/I AK Native” ELSE IF [ERI_Asian] = 1 THEN RETURN “Asian” ELSE IF [ERI_Black_Afr.Amer] = 1 THEN RETURN “Black/AA” ELSE IF [ERI_HI_PacIsl] = 1 THEN RETURN “Haw/Pac Isl.” ELSE IF [ERI_White] = 1 THEN RETURN “White” Comment: If the ERI Flag for Hispanic is True (1), the employee is classified as “Hispanic” Comment: If more than 1 non-Hispanic ERI Flag is true, return “Two or More” DATAFRAME lname fname rno_cd eri_afr_amer eri_asian eri_hawaiian eri_hispanic eri_nat_amer eri_white rno_defined 0 MOST JEFF E 0 0 0 0 0 1 White 1 CRUISE TOM E 0 0 0 1 0 0 White 2 DEPP JOHNNY 0 0 0 0 0 1 Unknown 3 DICAP LEO 0 0 0 0 0 1 Unknown 4 BRANDO MARLON E 0 0 0 0 0 0 White 5 HANKS TOM 0 0 0 0 0 1 Unknown 6 DENIRO ROBERT E 0 1 0 0 0 1 White 7 PACINO AL E 0 0 0 0 0 1 White 8 WILLIAMS ROBIN E 0 0 1 0 0 0 White 9 EASTWOOD CLINT E 0 0 0 0 0 1 White 3. index: 52 url:https://stackoverflow.com/questions/22219004/how-to-group-dataframe-rows-into-list-in-pandas-groupby Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 1 0 1 1 1 0 1 1 1 1 1 0.8 Function 1 1 1 1 1 1 1 1 0 1 1 0.9 A1 1 1 1 1 1 1 0 1 1 1 0 0.9 A2 0 1 1 1 0 1 0 0 0 1 1 0.5 A3 1 1 1 1 1 0 1 0 1 1 1 0.8 Origin: Problem: I have a pandas data frame df like: a b A 1 A 2 B 5 B 5 B 4 C 6 I want to group by the first column and get second column as lists in rows: A [1,2] B [5,5,4] C [6] Is it possible to do something like this using pandas groupby? A: import pandas as pd df = pd.DataFrame( {'a':['A','A','B','B','B','C'], 'b':[1,2,5,5,4,6]}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): return df.groupby('a')['b'].apply(list).reset_index(name='new') result.columns=['a','new'] print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) Function: Problem: I have a pandas data frame df like: a b A 1 A 2 B 5 B 5 B 4 C 6 I want to group by the first column and get second column as lists in rows: A [1,2] B [5,5,4] C [6] Is it possible to do something like this using pandas groupby? A: import pandas as pd def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return result Test: def g(df): return df.groupby('a')['b'].apply(list).reset_index(name='new') df = pd.DataFrame( {'a':['A','A','B','B','B','C'], 'b':[1,2,5,5,4,6]}) result = f(df.copy()) result.columns=['a','new'] print(result) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) A1: Problem: I have a pandas data frame df of two rows, I want to group by the first column and get second column as lists in rows: input: a b A 1 A 2 B 5 B 5 B 4 C 6 desired: A [1,2] B [5,5,4] C [6] A: import pandas as pd df = pd.DataFrame( {'a':['A','A','B','B','B','C'], 'b':[1,2,5,5,4,6]}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): return df.groupby('a')['b'].apply(list).reset_index(name='new') result.columns=['a','new'] print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) A2: Problem: I have a pandas data frame df like: a b B 1 B 2 A 5 A 5 A 4 D 6 I want to group by the first column and get second column as lists in rows: B [1,2] A [5,5,4] D [6] Is it possible to do something like this using pandas groupby? A: import pandas as pd df = pd.DataFrame( {'a':['B','B','A','A','A','D'], 'b':[1,2,5,5,4,6]}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): return df.groupby('a')['b'].apply(list).reset_index(name='new') result.columns=['a','new'] print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) A3: Problem: I have a pandas data frame df like: a b 1 A 2 A 5 B 5 B 4 B 6 C I want to group by the second column and get first column as lists in rows: A [1,2] B [5,5,4] C [6] Is it possible to do something like this using pandas groupby? A: import pandas as pd df = pd.DataFrame( {'b':['A','A','B','B','B','C'], 'a':[1,2,5,5,4,6]}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): return df.groupby('b')['a'].apply(list).reset_index(name='new') result.columns=['b','new'] print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) 4. index: 97 url:https://stackoverflow.com/questions/14745022/how-to-split-a-dataframe-string-column-into-two-columns Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 1 0 1 1 0 1 1 1 1 1 1 0.8 Function 1 0 1 1 1 1 1 1 0 1 1 0.8 A1 1 1 0 1 1 1 0 1 1 0 1 0.7 A2 0 0 1 1 0 0 0 0 0 0 1 0.2 A3 0 0 0 0 0 0 0 0 0 0 0 0 Origin: Problem: I have a data frame with one (string) column and I'd like to split it into two (string) columns, with one column header as 'fips' and the other 'row' My dataframe df looks like this: row 0 00000 UNITED STATES 1 01000 ALABAMA 2 01001 Autauga County, AL 3 01003 Baldwin County, AL 4 01005 Barbour County, AL I do not know how to use df.row.str[:] to achieve my goal of splitting the row cell. I can use df['fips'] = hello to add a new column and populate it with hello. Any ideas? fips row 0 00000 UNITED STATES 1 01000 ALABAMA 2 01001 Autauga County, AL 3 01003 Baldwin County, AL 4 01005 Barbour County, AL A: import pandas as pd df = pd.DataFrame({'row': ['00000 UNITED STATES', '01000 ALABAMA', '01001 Autauga County, AL', '01003 Baldwin County, AL', '01005 Barbour County, AL']}) ### BEGIN SOLUTION [insert] ### END SOLUTION result = df Test: def g(df): return pd.DataFrame(df.row.str.split(' ',1).tolist(), columns = ['fips','row']) result=result[['fips','row']] print(result) df = pd.DataFrame({'row': ['00000 UNITED STATES', '01000 ALABAMA', '01001 Autauga County, AL', '01003 Baldwin County, AL', '01005 Barbour County, AL']}) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) Function: Problem: I have a data frame with one (string) column and I'd like to split it into two (string) columns, with one column header as 'fips' and the other 'row' My dataframe df looks like this: row 0 00000 UNITED STATES 1 01000 ALABAMA 2 01001 Autauga County, AL 3 01003 Baldwin County, AL 4 01005 Barbour County, AL I do not know how to use df.row.str[:] to achieve my goal of splitting the row cell. I can use df['fips'] = hello to add a new column and populate it with hello. Any ideas? fips row 0 00000 UNITED STATES 1 01000 ALABAMA 2 01001 Autauga County, AL 3 01003 Baldwin County, AL 4 01005 Barbour County, AL A: import pandas as pd def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return result Test: def g(df): return pd.DataFrame(df.row.str.split(' ',1).tolist(), columns = ['fips','row']) df = pd.DataFrame({'row': ['00000 UNITED STATES', '01000 ALABAMA', '01001 Autauga County, AL', '01003 Baldwin County, AL', '01005 Barbour County, AL']}) result = f(df.copy()) result=result[['fips','row']] print(result) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) A1: Problem: I have a data frame with one (string) column and I'd like to split it into two (string) columns, with one column header as 'fips' and the other 'row' My dataframe df looks like this: row 0 00000 UNITED STATES 1 01000 ALABAMA 2 01001 Autauga County, AL 3 01003 Baldwin County, AL 4 01005 Barbour County, AL desired: fips row 0 00000 UNITED STATES 1 01000 ALABAMA 2 01001 Autauga County, AL 3 01003 Baldwin County, AL 4 01005 Barbour County, AL A: import pandas as pd df = pd.DataFrame({'row': ['00000 UNITED STATES', '01000 ALABAMA', '01001 Autauga County, AL', '01003 Baldwin County, AL', '01005 Barbour County, AL']}) ### BEGIN SOLUTION [insert] ### END SOLUTION result = df Test: def g(df): return pd.DataFrame(df.row.str.split(' ',1).tolist(), columns = ['fips','row']) result=result[['fips','row']] print(result) df = pd.DataFrame({'row': ['00000 UNITED STATES', '01000 ALABAMA', '01001 Autauga County, AL', '01003 Baldwin County, AL', '01005 Barbour County, AL']}) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) A2: Problem: I have a data frame with one (string) column and I'd like to split it into two (string) columns, with one column header as 'fips' and the other 'row' My dataframe df looks like this: row 0 114 AAAAAA 1 514 ENENEN 2 1926 HAHAHA 3 0817 O-O,O-O 4 998244353 TTTTTT I do not know how to use df.row.str[:] to achieve my goal of splitting the row cell. I can use df['fips'] = hello to add a new column and populate it with hello. Any ideas? fips row 0 114 AAAAAA 1 514 ENENEN 2 1926 HAHAHA 3 0817 O-O,O-O 4 998244353 TTTTTT A: import pandas as pd df = pd.DataFrame({'row': ['114 AAAAAA', '514 ENENEN', '1926 HAHAHA', '0817 O-O,O-O', '998244353 TTTTTT']}) ### BEGIN SOLUTION [insert] ### END SOLUTION result = df Test: def g(df): return pd.DataFrame(df.row.str.split(' ',1).tolist(), columns = ['fips','row']) result=result[['fips','row']] print(result) df = pd.DataFrame({'row': ['114 AAAAAA', '514 ENENEN', '1926 HAHAHA', '0817 O-O,O-O', '998244353 TTTTTT']}) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) A3: Problem: I have a data frame with one (string) column and I'd like to split it into three(string) columns, with one column header as 'fips' ,’medi’ and ‘row’ My dataframe df looks like this: row 0 00000 UNITED STATES 1 01000 ALAB AMA 2 01001 Autauga County, AL 3 01003 Baldwin County, AL 4 01005 Barbour County, AL I do not know how to use df.row.str[:] to achieve my goal of splitting the row cell. I can use df['fips'] = hello to add a new column and populate it with hello. Any ideas? fips medi row 0 00000 UNITED STATES 1 01000 ALAB AMA 2 01001 Autauga County, AL 3 01003 Baldwin County, AL 4 01005 Barbour County, AL A: import pandas as pd df = pd.DataFrame({'row': ['00000 UNITED STATES', '01000 ALAB AMA', '01001 Autauga County, AL', '01003 Baldwin County, AL', '01005 Barbour County, AL']}) ### BEGIN SOLUTION [insert] ### END SOLUTION result = df Test: def g(df): return pd.DataFrame(df.row.str.split(' ',2).tolist(), columns = ['fips','medi','row']) result=result[['fips','medi','row']] print(result) df = pd.DataFrame({'row': ['00000 UNITED STATES', '01000 ALAB AMA', '01001 Autauga County, AL', '01003 Baldwin County, AL', '01005 Barbour County, AL']}) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) 5. index:1024 url:https://stackoverflow.com/questions/34317149/pandas-groupby-with-bin-counts Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 1 0 0 0 0 0 0 0 1 0 1 0.2 Function 0 0 0 0 0 0 0 0 0 0 0 0 A1 1 1 0 1 0 0 0 0 0 0 0 0.3 A2 1 0 1 1 0 0 0 1 1 0 1 0.5 A3 Origin: Problem: I have a DataFrame that looks like this: +----------+---------+-------+ | username | post_id | views | +----------+---------+-------+ | john | 1 | 3 | | john | 2 | 23 | | john | 3 | 44 | | john | 4 | 82 | | jane | 7 | 5 | | jane | 8 | 25 | | jane | 9 | 46 | | jane | 10 | 56 | +----------+---------+-------+ and I would like to transform it to count views that belong to certain bins like this: +------+------+-------+-------+--------+ | | 1-10 | 11-25 | 25-50 | 51-100 | +------+------+-------+-------+--------+ | john | 1 | 1 | 1 | 1 | | jane | 1 | 1 | 1 | 1 | +------+------+-------+-------+--------+ I tried: bins = [1, 10, 25, 50, 100] groups = df.groupby(pd.cut(df.views, bins)) groups.username.count() But it only gives aggregate counts and not counts by user. How can I get bin counts by user? The aggregate counts (using my real data) looks like this: impressions (2500, 5000] 2332 (5000, 10000] 1118 (10000, 50000] 570 (50000, 10000000] 14 Name: username, dtype: int64 A: import pandas as pd import io data = io.StringIO("""\ username post_id views john 1 3 john 2 23 john 3 44 john 4 82 jane 7 5 jane 8 25 jane 9 46 jane 10 56 """) df = pd.read_csv(data, delim_whitespace=True) bins = [1, 10, 25, 50, 100] ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df, bin): groups = df.groupby(['username', pd.cut(df.views, bins)]) return groups.size().unstack() df = pd.read_csv(data, delim_whitespace=True) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) Function: import pandas as pd import io def f(df, bin): ### BEGIN SOLUTION [insert] ### END SOLUTION return result Test: def g(df, bin): groups = df.groupby(['username', pd.cut(df.views, bins)]) return groups.size().unstack() data = io.StringIO("""\ username post_id views john 1 3 john 2 23 john 3 44 john 4 82 jane 7 5 jane 8 25 jane 9 46 jane 10 56 """) df = pd.read_csv(data, delim_whitespace=True) bins = [1, 10, 25, 50, 100] result = f(df.copy(), bin) print(result) print(pd.testing.assert_frame_equal(g(df.copy(),bin), result, check_dtype=False)) A1: Problem: I have a DataFrame and I would like to transform it to count views that belong to certain bins. example: +----------+---------+-------+ | username | post_id | views | +----------+---------+-------+ | john | 1 | 3 | | john | 2 | 23 | | john | 3 | 44 | | john | 4 | 82 | | jane | 7 | 5 | | jane | 8 | 25 | | jane | 9 | 46 | | jane | 10 | 56 | +----------+---------+-------+ desired: +------+------+-------+-------+--------+ | | 1-10 | 11-25 | 25-50 | 51-100 | +------+------+-------+-------+--------+ | john | 1 | 1 | 1 | 1 | | jane | 1 | 1 | 1 | 1 | +------+------+-------+-------+--------+ I tried: bins = [1, 10, 25, 50, 100] groups = df.groupby(pd.cut(df.views, bins)) groups.username.count() But it only gives aggregate counts and not counts by user. How can I get bin counts by user? A: import pandas as pd import io data = io.StringIO("""\ username post_id views john 1 3 john 2 23 john 3 44 john 4 82 jane 7 5 jane 8 25 jane 9 46 jane 10 56 """) df = pd.read_csv(data, delim_whitespace=True) bins = [1, 10, 25, 50, 100] ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df, bin): groups = df.groupby(['username', pd.cut(df.views, bins)]) return groups.size().unstack() df = pd.read_csv(data, delim_whitespace=True) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) A2: Problem: I have a DataFrame that looks like this: +----------+---------+-------+ | username | post_id | views | +----------+---------+-------+ | tom | 10 | 3 | | tom | 9 | 23 | | tom | 8 | 44 | | tom | 7 | 82 | | jack | 6 | 5 | | jack | 5 | 25 | | jack | 4 | 46 | | jack | 3 | 56 | +----------+---------+-------+ and I would like to transform it to count views that belong to certain bins like this: +------+------+-------+-------+--------+ | | 1-10 | 11-25 | 25-50 | 51-100 | +------+------+-------+-------+--------+ | tom | 1 | 1 | 1 | 1 | | jack | 1 | 1 | 1 | 1 | +------+------+-------+-------+--------+ I tried: bins = [1, 10, 25, 50, 100] groups = df.groupby(pd.cut(df.views, bins)) groups.username.count() But it only gives aggregate counts and not counts by user. How can I get bin counts by user? The aggregate counts (using my real data) looks like this: impressions (2500, 5000] 2332 (5000, 10000] 1118 (10000, 50000] 570 (50000, 10000000] 14 Name: username, dtype: int64 A: import pandas as pd import io data = io.StringIO("""\ username post_id views tom 10 3 tom 9 23 tom 8 44 tom 7 82 jack 6 5 jack 5 25 jack 4 46 jack 3 56 """) df = pd.read_csv(data, delim_whitespace=True) bins = [1, 10, 25, 50, 100] ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df, bin): groups = df.groupby(['username', pd.cut(df.views, bins)]) return groups.size().unstack() df = pd.read_csv(data, delim_whitespace=True) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) 6. index:1044 url:https://stackoverflow.com/questions/23361218/pandas-dataframe-merge-summing-column Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 1 0 0 0 1 0 0 0 0 1 1 0.3 Function 0 0 0 0 0 0 0 1 0 0 1 0.1 A1 0 0 0 0 1 0 0 0 0 0 1 0.1 A2 1 0 0 0 1 0 0 1 0 1 1 0.4 A3 0 1 0 0 0 1 0 0 1 1 1 0.4 Origin: Problem: I'm trying to merge two DataFrames summing columns value. >>> print(df1) id name weight 0 1 A 0 1 2 B 10 2 3 C 10 >>> print(df2) id name weight 0 2 B 15 1 3 C 10 I need to sum weight values during merging for similar values in the common column. merge = pd.merge(df1, df2, how='inner') So the output will be something like following. id name weight 1 2 B 25 2 3 C 20 A: import pandas as pd import io data1 = io.StringIO("""\ id name weight 0 1 A 0 1 2 B 10 2 3 C 10 """) data2 = io.StringIO("""\ id name weight 0 2 B 15 1 3 C 10 """) df1 = pd.read_csv(data1, delim_whitespace=True) df2 = pd.read_csv(data2, delim_whitespace=True) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df1, df2): result = pd.merge(df1, df2, how='inner', on=['id', 'name']) result['weight'] = result['weight_x'] + result['weight_y'] result = result[['id', 'name', 'weight']] return result print(pd.testing.assert_frame_equal(g(df1.copy(),df2.copy()), result, check_dtype=False)) Function: import pandas as pd import io def f(df1, df2): ### BEGIN SOLUTION [insert] ### END SOLUTION return result Test: def g(df1, df2): result = pd.merge(df1, df2, how='inner', on=['id', 'name']) result['weight'] = result['weight_x'] + result['weight_y'] result = result[['id', 'name', 'weight']] return result data1 = io.StringIO("""\ id name weight 0 1 A 0 1 2 B 10 2 3 C 10 """) data2 = io.StringIO("""\ id name weight 0 2 B 15 1 3 C 10 """) df1 = pd.read_csv(data1, delim_whitespace=True) df2 = pd.read_csv(data2, delim_whitespace=True) print(f(df1.copy(),df2.copy())) print(pd.testing.assert_frame_equal(g(df1.copy(),df2.copy()), f(df1.copy(),df2.copy()), check_dtype=False)) A1: Problem: I'm trying to merge two DataFrames summing columns value.I need to sum weight values during merging for similar values in the common column. example: >>> print(df1) id name weight 0 1 A 0 1 2 B 10 2 3 C 10 >>> print(df2) id name weight 0 2 B 15 1 3 C 10 I have try merge = pd.merge(df1, df2, how='inner') So the output will be something like following. id name weight 1 2 B 25 2 3 C 20 A: import pandas as pd import io data1 = io.StringIO("""\ id name weight 0 1 A 0 1 2 B 10 2 3 C 10 """) data2 = io.StringIO("""\ id name weight 0 2 B 15 1 3 C 10 """) df1 = pd.read_csv(data1, delim_whitespace=True) df2 = pd.read_csv(data2, delim_whitespace=True) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df1, df2): result = pd.merge(df1, df2, how='inner', on=['id', 'name']) result['weight'] = result['weight_x'] + result['weight_y'] result = result[['id', 'name', 'weight']] return result print(pd.testing.assert_frame_equal(g(df1.copy(),df2.copy()), result, check_dtype=False)) A2: Problem: I'm trying to merge two DataFrames summing columns value. >>> print(df1) id name weight 0 1 A 0 1 2 B 10 2 3 C 10 >>> print(df2) id name weight 0 2 B 15 1 3 C 10 2 1 D 3 I need to sum weight values during merging for similar values in the common column. merge = pd.merge(df1, df2, how='inner') So the output will be something like following. id name weight 1 2 B 25 2 3 C 20 A: import pandas as pd import io data1 = io.StringIO("""\ id name weight 0 1 A 0 1 2 B 10 2 3 C 10 """) data2 = io.StringIO("""\ id name weight 0 2 B 15 1 3 C 10 2 1 D 3 """) df1 = pd.read_csv(data1, delim_whitespace=True) df2 = pd.read_csv(data2, delim_whitespace=True) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df1, df2): result = pd.merge(df1, df2, how='inner', on=['id', 'name']) result['weight'] = result['weight_x'] + result['weight_y'] result = result[['id', 'name', 'weight']] return result print(pd.testing.assert_frame_equal(g(df1.copy(),df2.copy()), result, check_dtype=False)) A3: Problem: I'm trying to merge two DataFrames maxing columns value. >>> print(df1) id name weight 0 1 A 0 1 2 B 10 2 3 C 10 >>> print(df2) id name weight 0 2 B 15 1 3 C 10 I need to max weight values during merging for similar values in the common column. merge = pd.merge(df1, df2, how='inner') So the output will be something like following. id name weight 1 2 B 15 2 3 C 10 A: import pandas as pd import io data1 = io.StringIO("""\ id name weight 0 1 A 0 1 2 B 10 2 3 C 10 """) data2 = io.StringIO("""\ id name weight 0 2 B 15 1 3 C 10 """) df1 = pd.read_csv(data1, delim_whitespace=True) df2 = pd.read_csv(data2, delim_whitespace=True) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df1, df2): result = pd.merge(df1, df2, how='inner', on=['id', 'name']) result['weight'] = max(result['weight_x'], result['weight_y']) result = result[['id', 'name', 'weight']] return result print(pd.testing.assert_frame_equal(g(df1.copy(),df2.copy()), result, check_dtype=False)) 7. index:1063 url:https://stackoverflow.com/questions/20209600/pandas-dataframe-remove-constant-column Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 1 0 0 1 0 0 0 1 0 0 1 0.3 Function 1 1 0 1 1 0 1 0 1 0 1 0.7 A1 1 1 1 0 1 1 1 0 0 0 1 0.6 A2 1 0 1 0 1 1 1 1 1 1 1 0.8 A3 0 0 0 0 0 0 0 0 0 0 0 0 Origin: Problem: I have a dataframe that may or may not have columns that are the same value. For example row A B 1 9 0 2 7 0 3 5 0 4 2 0 I'd like to return just row A 1 9 2 7 3 5 4 2 Is there a simple way to identify if any of these columns exist and then remove them? A: import pandas as pd import io data = io.StringIO("""\ A B row 0 9 0 1 1 7 0 2 2 5 0 3 3 2 0 4 """) df = pd.read_csv(data, delim_whitespace=True) ### BEGIN SOLUTION [insert] ### END SOLUTION result = df Test: def g(df): return df.loc[:,df.apply(pd.Series.nunique) != 1] data = io.StringIO("""\ A B row 0 9 0 1 1 7 0 2 2 5 0 3 3 2 0 4 """) df = pd.read_csv(data, delim_whitespace=True) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) Function: Problem: I have a dataframe that may or may not have columns that are the same value. For example row A B 1 9 0 2 7 0 3 5 0 4 2 0 I'd like to return just row A 1 9 2 7 3 5 4 2 Is there a simple way to identify if any of these columns exist and then remove them? A: import pandas as pd import io def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return result Test: def g(df): return df.loc[:,df.apply(pd.Series.nunique) != 1] data = io.StringIO("""\ A B row 0 9 0 1 1 7 0 2 2 5 0 3 3 2 0 4 """) df = pd.read_csv(data, delim_whitespace=True) print(f(df.copy())) print(pd.testing.assert_frame_equal(g(df.copy()), f(df.copy()), check_dtype=False)) A1: Problem: I have a dataframe that may or may not have columns that are the same value and I want to identify if any of these columns exist and then remove them example: row A B 1 9 0 2 7 0 3 5 0 4 2 0 desired: row A 1 9 2 7 3 5 4 2 A: import pandas as pd import io data = io.StringIO("""\ A B row 0 9 0 1 1 7 0 2 2 5 0 3 3 2 0 4 """) df = pd.read_csv(data, delim_whitespace=True) ### BEGIN SOLUTION [insert] ### END SOLUTION result = df Test: def g(df): return df.loc[:,df.apply(pd.Series.nunique) != 1] data = io.StringIO("""\ A B row 0 9 0 1 1 7 0 2 2 5 0 3 3 2 0 4 """) df = pd.read_csv(data, delim_whitespace=True) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) A2: Problem: I have a dataframe that may or may not have columns that are the same value. For example 0 1 2 0 1 9 0 1 2 7 0 2 3 7 0 I'd like to return just 0 1 0 1 9 1 2 7 2 3 7 Is there a simple way to identify if any of these columns exist and then remove them? A: import pandas as pd import io data = io.StringIO("""\ 0 1 2 0 1 9 0 1 2 7 0 2 3 7 0 """) df = pd.read_csv(data, delim_whitespace=True) ### BEGIN SOLUTION [insert] ### END SOLUTION result = df Test: def g(df): return df.loc[:,df.apply(pd.Series.nunique) != 1] data = io.StringIO("""\ 0 1 2 0 1 9 0 1 2 7 0 2 3 7 0 """) df = pd.read_csv(data, delim_whitespace=True) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) A3: Problem: I have a dataframe that may or may not have columns that are not the same value. For example row A B 1 9 0 2 7 0 3 5 0 4 2 0 I'd like to return just B 0 0 0 0 Is there a simple way to identify if any of these columns exist and then remove them? A: import pandas as pd import io data = io.StringIO("""\ A B row 0 9 0 1 1 7 0 2 2 5 0 3 3 2 0 4 """) df = pd.read_csv(data, delim_whitespace=True) ### BEGIN SOLUTION [insert] ### END SOLUTION result = df Test: def g(df): return df.loc[:,df.apply(pd.Series.nunique) == 1] data = io.StringIO("""\ A B row 0 9 0 1 1 7 0 2 2 5 0 3 3 2 0 4 """) df = pd.read_csv(data, delim_whitespace=True) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) 8. index:1070 url:https://stackoverflow.com/questions/17702272/convert-pandas-series-containing-string-to-boolean Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 0 0 0 1 1 1 0 0 1 0 1 0.4 Function 1 1 0 0 1 0 1 1 0 1 1 0.5 A1 0 0 1 0 0 0 0 0 0 0 1 0.1 A2 0 0 0 0 0 0 0 0 0 0 0 0 A3 0 0 0 0 0 0 0 1 0 0 1 0.1 Origin: Problem: I have a DataFrame named df as Order Number Status 1 1668 Undelivered 2 19771 Undelivered 3 100032108 Undelivered 4 2229 Delivered 5 00056 Undelivered I would like to convert the Status column to boolean (True when Status is Delivered and False when Status is Undelivered) but if Status is neither 'Undelivered' neither 'Delivered' it should be considered as NotANumber or something like that. I would like to use a dict d = { 'Delivered': True, 'Undelivered': False } so I could easily add other string which could be either considered as True or False. A: import pandas as pd import io data = io.StringIO("""\ Number Status 1 1668 Undelivered 2 19771 Undelivered 3 100032108 Undelivered 4 2229 Delivered 5 00056 Undelivered """) df = pd.read_csv(data, delim_whitespace=True) ### BEGIN SOLUTION [insert] ### END SOLUTION print(df) Test: def g(df): return df.replace({'Status': {'Delivered': True, 'Undelivered': False}}) data = io.StringIO("""\ Number Status 1 1668 Undelivered 2 19771 Undelivered 3 100032108 Undelivered 4 2229 Delivered 5 00056 Undelivered """) df = pd.read_csv(data, delim_whitespace=True) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) Function: Problem: I have a DataFrame named df as Order Number Status 1 1668 Undelivered 2 19771 Undelivered 3 100032108 Undelivered 4 2229 Delivered 5 00056 Undelivered I would like to convert the Status column to boolean (True when Status is Delivered and False when Status is Undelivered) but if Status is neither 'Undelivered' neither 'Delivered' it should be considered as NotANumber or something like that. I would like to use a dict d = { 'Delivered': True, 'Undelivered': False } so I could easily add other string which could be either considered as True or False. A: import pandas as pd import io def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return result Test: def g(df): return df.replace({'Status': {'Delivered': True, 'Undelivered': False}}) data = io.StringIO("""\ Number Status 1 1668 Undelivered 2 19771 Undelivered 3 100032108 Undelivered 4 2229 Delivered 5 00056 Undelivered """) df = pd.read_csv(data, delim_whitespace=True) print(f(df.copy())) print(pd.testing.assert_frame_equal(g(df.copy()), f(df.copy()), check_dtype=False)) A1: Problem: I have a DataFrame named df. I would like to convert the Status column to boolean (True when Status is Delivered and False when Status is Undelivered) but if Status is neither 'Undelivered' neither 'Delivered' it should be considered as NotANumber or something like that. example: Order Number Status 1 1668 Undelivered 2 19771 Undelivered 3 100032108 Undelivered 4 2229 Delivered 5 00056 Undelivered A: import pandas as pd import io data = io.StringIO("""\ Number Status 1 1668 Undelivered 2 19771 Undelivered 3 100032108 Undelivered 4 2229 Delivered 5 00056 Undelivered """) df = pd.read_csv(data, delim_whitespace=True) ### BEGIN SOLUTION [insert] ### END SOLUTION print(df) Test: def g(df): return df.replace({'Status': {'Delivered': True, 'Undelivered': False}}) data = io.StringIO("""\ Number Status 1 1668 Undelivered 2 19771 Undelivered 3 100032108 Undelivered 4 2229 Delivered 5 00056 Undelivered """) df = pd.read_csv(data, delim_whitespace=True) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) A2: Problem: I have a DataFrame named df as Order Number Status 1 3 Undelivered 2 6 Undelivered 3 9 Undelivered 4 12 Delivered 5 11 Undelivered I would like to convert the Status column to boolean (True when Status is Delivered and False when Status is Undelivered) but if Status is neither 'Undelivered' neither 'Delivered' it should be considered as NotANumber or something like that. I would like to use a dict d = { 'Delivered': True, 'Undelivered': False } so I could easily add other string which could be either considered as True or False. A: import pandas as pd import io data = io.StringIO("""\ Number Status 1 3 Undelivered 2 6 Undelivered 3 9 Undelivered 4 12 Delivered 5 11 Undelivered """) df = pd.read_csv(data, delim_whitespace=True) ### BEGIN SOLUTION [insert] ### END SOLUTION print(df) Test: def g(df): return df.replace({'Status': {'Delivered': True, 'Undelivered': False}}) data = io.StringIO("""\ Number Status 1 1668 Undelivered 2 19771 Undelivered 3 100032108 Undelivered 4 2229 Delivered 5 00056 Undelivered """) df = pd.read_csv(data, delim_whitespace=True) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) A3: Problem: I have a DataFrame named df as Order Number Status 1 1668 Undelivered 2 19771 Undelivered 3 100032108 Undelivered 4 2229 Delivered 5 00056 Undelivered I would like to convert the Status column to boolean (False when Status is Delivered and True when Status is Undelivered) but if Status is neither 'Undelivered' neither 'Delivered' it should be considered as NotANumber or something like that. I would like to use a dict d = { 'Delivered': False, 'Undelivered': True } so I could easily add other string which could be either considered as True or False. A: import pandas as pd import io data = io.StringIO("""\ Number Status 1 1668 Undelivered 2 19771 Undelivered 3 100032108 Undelivered 4 2229 Delivered 5 00056 Undelivered """) df = pd.read_csv(data, delim_whitespace=True) ### BEGIN SOLUTION [insert] ### END SOLUTION print(df) Test: def g(df): return df.replace({'Status': {'Delivered': False, 'Undelivered': True}}) data = io.StringIO("""\ Number Status 1 1668 Undelivered 2 19771 Undelivered 3 100032108 Undelivered 4 2229 Delivered 5 00056 Undelivered """) df = pd.read_csv(data, delim_whitespace=True) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) 9. index: 1082 url: https://stackoverflow.com/questions/30631841/pandas-how-do-i-assign-values-based-on-multiple-conditions-for-existing-columns Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 1 1 1 1 1 0 1 1 1 1 1 0.9 Function 1 0 0 0 1 1 1 1 1 0 1 0.5 A2 1 1 1 1 1 1 1 1 1 1 1 1 A3 1 0 1 0 1 1 1 0 1 1 1 0.7 Origin: Problem: I would like to create a new column with a numerical value based on the following conditions: a. if gender is male & pet1=pet2, points = 5 b. if gender is female & (pet1 is 'cat' or pet1='dog'), points = 5 c. all other combinations, points = 0 gender pet1 pet2 0 male dog dog 1 male cat cat 2 male dog cat 3 female cat squirrel 4 female dog dog 5 female squirrel cat 6 squirrel dog cat I would like the end result to be as follows: gender pet1 pet2 points 0 male dog dog 5 1 male cat cat 5 2 male dog cat 0 3 female cat squirrel 5 4 female dog dog 5 5 female squirrel cat 0 6 squirrel dog cat 0 How do I accomplish this? A: import pandas as pd import io data = io.StringIO("""\ gender pet1 pet2 0 male dog dog 1 male cat cat 2 male dog cat 3 female cat squirrel 4 female dog dog 5 female squirrel cat 6 squirrel dog cat """) df = pd.read_csv(data, delim_whitespace=True) ### BEGIN SOLUTION [insert] ### END SOLUTION result = df print(result) Test: import numpy as np def g(df): df['points'] = np.where( ( (df['gender'] == 'male') & (df['pet1'] == df['pet2'] ) ) | ( (df['gender'] == 'female') & (df['pet1'].isin(['cat','dog'] ) ) ), 5, 0) return df data = io.StringIO("""\ gender pet1 pet2 0 male dog dog 1 male cat cat 2 male dog cat 3 female cat squirrel 4 female dog dog 5 female squirrel cat 6 squirrel dog cat """) df = pd.read_csv(data, delim_whitespace=True) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) Function: Problem: I would like to create a new column with a numerical value based on the following conditions: a. if gender is male & pet1=pet2, points = 5 b. if gender is female & (pet1 is 'cat' or pet1='dog'), points = 5 c. all other combinations, points = 0 gender pet1 pet2 0 male dog dog 1 male cat cat 2 male dog cat 3 female cat squirrel 4 female dog dog 5 female squirrel cat 6 squirrel dog cat I would like the end result to be as follows: gender pet1 pet2 points 0 male dog dog 5 1 male cat cat 5 2 male dog cat 0 3 female cat squirrel 5 4 female dog dog 5 5 female squirrel cat 0 6 squirrel dog cat 0 How do I accomplish this? A: import pandas as pd import io def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return result Test: import numpy as np def g(df): df['points'] = np.where( ( (df['gender'] == 'male') & (df['pet1'] == df['pet2'] ) ) | ( (df['gender'] == 'female') & (df['pet1'].isin(['cat','dog'] ) ) ), 5, 0) return df data = io.StringIO("""\ gender pet1 pet2 0 male dog dog 1 male cat cat 2 male dog cat 3 female cat squirrel 4 female dog dog 5 female squirrel cat 6 squirrel dog cat """) df = pd.read_csv(data, delim_whitespace=True) print(f(df.copy())) print(pd.testing.assert_frame_equal(g(df.copy()), f(df.copy()), check_dtype=False)) A2: Problem: I would like to create a new column with a numerical value based on the following conditions: a. if gender is male & pet1=pet2, points = 10 b. if gender is female & (pet1 is 'cat' or pet1='dog'), points = 10 c. all other combinations, points = 0 gender pet1 pet2 0 female wolf panda 1 male cat dog 2 female lizard snake 3 male hamster guinea_pig 4 male dog dog 5 femaile snake giraffe 6 female spider cobra I would like the end result to be as follows: gender pet1 pet2 points 0 female wolf panda 0 1 male cat dog 0 2 female lizard snake 0 3 male hamster guinea_pig 0 4 male dog dog 10 5 femaile snake giraffe 0 6 female spider cobra 0 How do I accomplish this? A: import pandas as pd import io data = io.StringIO("""\ gender pet1 pet2 0 female wolf panda 1 male cat dog 2 female lizard snake 3 male hamster guinea_pig 4 male dog dog 5 femaile snake giraffe 6 female spider cobra """) df = pd.read_csv(data, delim_whitespace=True) ### BEGIN SOLUTION [insert] ### END SOLUTION result = df print(result) Test: import numpy as np def g(df): df['points'] = np.where( ( (df['gender'] == 'male') & (df['pet1'] == df['pet2'] ) ) | ( (df['gender'] == 'female') & (df['pet1'].isin(['cat','dog'] ) ) ), 10, 0) return df data = io.StringIO("""\ gender pet1 pet2 0 female wolf panda 1 male cat dog 2 female lizard snake 3 male hamster guinea_pig 4 male dog dog 5 femaile snake giraffe 6 female spider cobra """) df = pd.read_csv(data, delim_whitespace=True) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) A3: Problem: I would like to create a new column with a numerical value based on the following conditions: a. if gender is female & pet1=pet2, points = 10 b. if gender is male & (pet1 is 'cat' or pet1='dog'), points = 10 c. all other combinations, points = 2 gender pet1 pet2 0 male dog dog 1 male cat cat 2 male dog cat 3 female cat squirrel 4 female dog dog 5 female squirrel cat 6 squirrel dog cat I would like the end result to be as follows: gender pet1 pet2 points 0 male dog dog 10 1 male cat cat 10 2 male dog cat 10 3 female cat squirrel 2 4 female dog dog 10 5 female squirrel cat 2 6 squirrel dog cat 2 How do I accomplish this? A: import pandas as pd import io data = io.StringIO("""\ gender pet1 pet2 0 male dog dog 1 male cat cat 2 male dog cat 3 female cat squirrel 4 female dog dog 5 female squirrel cat 6 squirrel dog cat """) df = pd.read_csv(data, delim_whitespace=True) ### BEGIN SOLUTION [insert] ### END SOLUTION result = df print(result) Test: import numpy as np def g(df): df['points'] = np.where( ( (df['gender'] == 'female') & (df['pet1'] == df['pet2'] ) ) | ( (df['gender'] == 'male') & (df['pet1'].isin(['cat','dog'] ) ) ), 10, 2) return df data = io.StringIO("""\ gender pet1 pet2 0 male dog dog 1 male cat cat 2 male dog cat 3 female cat squirrel 4 female dog dog 5 female squirrel cat 6 squirrel dog cat """) df = pd.read_csv(data, delim_whitespace=True) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) 10. index: 1092 url: https://stackoverflow.com/questions/44978196/pandas-filling-missing-dates-and-values-within-group Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 0 0 0 0 0 0 0 0 0 0 0 0 Function 0 0 0 0 0 0 0 0 0 0 0 0 A2 0 0 0 0 0 0 0 0 0 0 0 0 A7 0 0 0 0 0 0 0 0 0 0 0 0 Origin: Problem: I've a data frame that looks like the following x = pd.DataFrame({'user': ['a','a','b','b'], 'dt': ['2016-01-01','2016-01-02', '2016-01-05','2016-01-06'], 'val': [1,33,2,1]}) What I would like to be able to do is find the minimum and maximum date within the date column and expand that column to have all the dates there while simultaneously filling in 0 for the val column. So the desired output is dt user val 0 2016-01-01 a 1 1 2016-01-02 a 33 2 2016-01-03 a 0 3 2016-01-04 a 0 4 2016-01-05 a 0 5 2016-01-06 a 0 6 2016-01-01 b 0 7 2016-01-02 b 0 8 2016-01-03 b 0 9 2016-01-04 b 0 10 2016-01-05 b 2 11 2016-01-06 b 1 I've tried the solution mentioned here and here but they aren't what I'm after. Any pointers much appreciated. A: import pandas as pd x = pd.DataFrame({'user': ['a','a','b','b'], 'dt': ['2016-01-01','2016-01-02', '2016-01-05','2016-01-06'], 'val': [1,33,2,1]}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): df.dt = pd.to_datetime(df.dt) return df.set_index(['dt', 'user']).unstack(fill_value=0).asfreq('D', fill_value=0).stack().sort_index(level=1).reset_index() df= pd.DataFrame({'user': ['a','a','b','b'], 'dt': ['2016-01-01','2016-01-02', '2016-01-05','2016-01-06'], 'val': [1,33,2,1]}) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) Function: Problem: I've a data frame that looks like the following x = pd.DataFrame({'user': ['a','a','b','b'], 'dt': ['2016-01-01','2016-01-02', '2016-01-05','2016-01-06'], 'val': [1,33,2,1]}) What I would like to be able to do is find the minimum and maximum date within the date column and expand that column to have all the dates there while simultaneously filling in 0 for the val column. So the desired output is dt user val 0 2016-01-01 a 1 1 2016-01-02 a 33 2 2016-01-03 a 0 3 2016-01-04 a 0 4 2016-01-05 a 0 5 2016-01-06 a 0 6 2016-01-01 b 0 7 2016-01-02 b 0 8 2016-01-03 b 0 9 2016-01-04 b 0 10 2016-01-05 b 2 11 2016-01-06 b 1 I've tried the solution mentioned here and here but they aren't what I'm after. Any pointers much appreciated. A: import pandas as pd def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return result Test: def g(df): df.dt = pd.to_datetime(df.dt) return df.set_index(['dt', 'user']).unstack(fill_value=0).asfreq('D', fill_value=0).stack().sort_index(level=1).reset_index() df= pd.DataFrame({'user': ['a','a','b','b'], 'dt': ['2016-01-01','2016-01-02', '2016-01-05','2016-01-06'], 'val': [1,33,2,1]}) print(f(df.copy())) print(pd.testing.assert_frame_equal(g(df.copy()), f(df.copy()), check_dtype=False)) A2: Problem: I've a data frame that looks like the following x = pd.DataFrame({'user': ['abc','abc','efg','efg'], 'dt': ['2022-01-01','2022-01-02', '2022-01-05','2022-01-06'], 'val': [1,14,51,4]}) What I would like to be able to do is find the minimum and maximum date within the date column and expand that column to have all the dates there while simultaneously filling in 0 for the val column. So the desired output is dt user val 0 2022-01-01 abc 1 1 2022-01-02 abc 14 2 2022-01-03 abc 0 3 2022-01-04 abc 0 4 2022-01-05 abc 0 5 2022-01-06 abc 0 6 2022-01-01 efg 0 7 2022-01-02 efg 0 8 2022-01-03 efg 0 9 2022-01-04 efg 0 10 2022-01-05 efg 51 11 2022-01-06 efg 4 I've tried the solution mentioned here and here but they aren't what I'm after. Any pointers much appreciated. A: import pandas as pd x = pd.DataFrame({'user': ['abc','abc','efg','efg'], 'dt': ['2022-01-01','2022-01-02', '2022-01-05','2022-01-06'], 'val': [1,14,51,4]}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): return df.set_index(['dt', 'user']).unstack(fill_value=0).asfreq('D', fill_value=0).stack().sort_index(level=1).reset_index() df= pd.DataFrame({'user': ['abc','abc','efg','efg'], 'dt': ['2022-01-01','2022-01-02', '2022-01-05','2022-01-06'], 'val': [1,14,51,4]}) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) A3: Problem: I've a data frame that looks like the following x = pd.DataFrame({'user': ['a','a','b','b'], 'dt': ['2016-01-01','2016-01-02', '2016-01-05','2016-01-06'], 'val': [1,33,2,1]}) What I would like to be able to do is find the minimum and maximum date within the date column and expand that column to have all the dates there while simultaneously filling in 233 for the val column. So the desired output is dt user val 0 2016-01-01 a 1 1 2016-01-02 a 33 2 2016-01-03 a 233 3 2016-01-04 a 233 4 2016-01-05 a 233 5 2016-01-06 a 233 6 2016-01-01 b 233 7 2016-01-02 b 233 8 2016-01-03 b 233 9 2016-01-04 b 233 10 2016-01-05 b 2 11 2016-01-06 b 1 I've tried the solution mentioned here and here but they aren't what I'm after. Any pointers much appreciated. A: import pandas as pd x = pd.DataFrame({'user': ['a','a','b','b'], 'dt': ['2016-01-01','2016-01-02', '2016-01-05','2016-01-06'], 'val': [1,33,2,1]}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): df.dt = pd.to_datetime(df.dt) return df.set_index(['dt', 'user']).unstack(fill_value=233).asfreq('D', fill_value=233).stack().sort_index(level=1).reset_index() df= pd.DataFrame({'user': ['a','a','b','b'], 'dt': ['2016-01-01','2016-01-02', '2016-01-05','2016-01-06'], 'val': [1,33,2,1]}) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) A7: Problem: I've a data frame that looks like the following x = pd.DataFrame({'user': ['a','a','b','b'], 'dt': ['2016-01-01','2016-01-02', '2016-01-05','2016-01-06'], 'val': [1,33,2,1]}) What I would like to be able to do is find the minimum and maximum date within the date column and expand that column to have all the dates there while simultaneously filling in the maximum val of the user for the val column. So the desired output is dt user val 0 2016-01-01 a 1 1 2016-01-02 a 33 2 2016-01-03 a 33 3 2016-01-04 a 33 4 2016-01-05 a 33 5 2016-01-06 a 33 6 2016-01-01 b 2 7 2016-01-02 b 2 8 2016-01-03 b 2 9 2016-01-04 b 2 10 2016-01-05 b 2 11 2016-01-06 b 1 I've tried the solution mentioned here and here but they aren't what I'm after. Any pointers much appreciated. A: import pandas as pd x = pd.DataFrame({'user': ['a','a','b','b'], 'dt': ['2016-01-01','2016-01-02', '2016-01-05','2016-01-06'], 'val': [1,33,2,1]}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): df.dt = pd.to_datetime(df.dt) return df.set_index(['dt', 'user']).unstack(fill_value=0).asfreq('D', fill_value=0).stack().sort_index(level=1).reset_index() df= pd.DataFrame({'user': ['a','a','b','b'], 'dt': ['2016-01-01','2016-01-02', '2016-01-05','2016-01-06'], 'val': [1,33,2,1]}) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) 11. index: 1087 url: https://stackoverflow.com/questions/17682613/how-to-convert-a-pandas-dataframe-subset-of-columns-and-rows-into-a-numpy-array Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 1 0 1 1 0 1 1 1 1 0 1 0.7 Function 1 0 0 1 1 1 1 1 0 0 1 0.6 A1 0 1 1 1 1 1 1 1 1 1 1 0.9 A2 A3 1 1 1 1 1 0 1 1 1 0 1 0.8 A4 A5 A6 0 0 0 0 0 0 0 0 0 0 0 0 A7 0 1 0 0 0 0 0 0 0 0 1 0.1 A8 1 0 1 1 1 1 1 1 1 0 1 0.8 html 1 1 1 1 1 1 1 1 1 1 1 1 Origin: Problem: I'm wondering if there is a simpler, memory efficient way to select a subset of rows and columns from a pandas DataFrame. For instance, given this dataframe: df = DataFrame(np.random.rand(4,5), columns = list('abcde')) print df a b c d e 0 0.945686 0.000710 0.909158 0.892892 0.326670 1 0.919359 0.667057 0.462478 0.008204 0.473096 2 0.976163 0.621712 0.208423 0.980471 0.048334 3 0.459039 0.788318 0.309892 0.100539 0.753992 I want only those rows in which the value for column 'c' is greater than 0.5, but I only need columns 'b' and 'e' for those rows. This is the method that I've come up with - perhaps there is a better "pandas" way? locs = [df.columns.get_loc(_) for _ in ['a', 'd']] print df[df.c > 0.5][locs] a d 0 0.945686 0.892892 My final goal is to convert the result to a numpy array to pass into an sklearn regression algorithm, so I will use the code above like this: training_set = array(df[df.c > 0.5][locs]) ... and that peeves me since I end up with a huge array copy in memory. Perhaps there's a better way for that too? Code: import pandas as pd import numpy as np df = pd.DataFrame(np.random.rand(4,5), columns = list('abcde')) columns = ['b','e'] ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) test: def g(df, columns): return df.loc[df['c']>0.5,columns] try: pd.testing.assert_frame_equal(result, g(df.copy(), columns)) print('Test passed!') except: print('Test failed!') Function: Problem: I'm wondering if there is a simpler, memory efficient way to select a subset of rows and columns from a pandas DataFrame. For instance, given this dataframe: df = DataFrame(np.random.rand(4,5), columns = list('abcde')) print df a b c d e 0 0.945686 0.000710 0.909158 0.892892 0.326670 1 0.919359 0.667057 0.462478 0.008204 0.473096 2 0.976163 0.621712 0.208423 0.980471 0.048334 3 0.459039 0.788318 0.309892 0.100539 0.753992 I want only those rows in which the value for column 'c' is greater than 0.5, but I only need columns 'b' and 'e' for those rows. This is the method that I've come up with - perhaps there is a better "pandas" way? locs = [df.columns.get_loc(_) for _ in ['a', 'd']] print df[df.c > 0.5][locs] a d 0 0.945686 0.892892 My final goal is to convert the result to a numpy array to pass into an sklearn regression algorithm, so I will use the code above like this: training_set = array(df[df.c > 0.5][locs]) ... and that peeves me since I end up with a huge array copy in memory. Perhaps there's a better way for that too? Code: import pandas as pd def f(df, columns): ### BEGIN SOLUTION [insert] ### END SOLUTION return result test: import numpy as np def g(df, columns): return df.loc[df['c']>0.5,columns] np.random.seed(42) df = pd.DataFrame(np.random.rand(4,5), columns = list('abcde')) columns = ['b','e'] try: pd.testing.assert_frame_equal(f(df.copy(), columns), g(df.copy(), columns)) print('Test passed!') except: print('Test failed!') A1: Problem: I'm wondering if there is a simpler, memory efficient way to select a subset of rows and columns from a pandas DataFrame. For instance, given this dataframe: df = DataFrame(np.random.rand(4,5), columns = list('abcde')) print df a b c d e 0 0.945686 0.000710 0.909158 0.892892 0.326670 1 0.919359 0.667057 0.462478 0.008204 0.473096 2 0.976163 0.621712 0.208423 0.980471 0.048334 3 0.459039 0.788318 0.309892 0.100539 0.753992 I want only those rows in which the value for column 'c' is greater than 0.5, but I only need columns 'b' and 'e' for those rows. This is the method that I've come up with - perhaps there is a better "pandas" way? locs = [df.columns.get_loc(_) for _ in ['a', 'd']] print df[df.c > 0.5][locs] a d 0 0.945686 0.892892 I’ve also tried to use df.ix[df.c > 0.5][locs], but it tells me that df.ix is out-of-version, and it is not appropriate to use df.ix for this problem Any help would be appreciated. Code: def f(df, columns): ### BEGIN SOLUTION [insert] ### END SOLUTION return result test: def g(df, columns): return df.loc[df['c']>0.5,columns] np.random.seed(42) df = DataFrame(np.random.rand(4,5), columns = list('abcde')) columns = ['b','e'] try: np.testing.assert_array_equal(f(df.copy(), columns), g(df.copy(), columns)) print('Test passed!') except: print('Test failed!') A3: Problem: I'm wondering if there is a simpler, memory efficient way to select a subset of rows and columns from a pandas DataFrame. For instance, given this dataframe: df = DataFrame(np.random.rand(4,5), columns = list('abcde')) print df a b c d e 0 0.945686 0.000710 0.909158 0.892892 0.326670 1 0.919359 0.667057 0.462478 0.008204 0.473096 2 0.976163 0.621712 0.208423 0.980471 0.048334 3 0.459039 0.788318 0.309892 0.100539 0.753992 I want only those rows in which the value for column 'c' is greater than 0.45, but I only need columns ‘a’, 'b' and 'e' for those rows. This is the method that I've come up with - perhaps there is a better "pandas" way? locs = [df.columns.get_loc(_) for _ in ['a', 'd']] print df[df.c > 0.45][locs] a d 0 0.945686 0.892892 1 0.919359 0.008204 My final goal is to convert the result to a numpy array to pass into an sklearn regression algorithm, so I will use the code above like this: training_set = array(df[df.c > 0.45][locs]) ... and that peeves me since I end up with a huge array copy in memory. Perhaps there's a better way for that too? Code: import pandas as pd def f(df, columns): ### BEGIN SOLUTION [insert] ### END SOLUTION return result test: import numpy as np def g(df, columns): return df.loc[df['c']>0.5,columns] np.random.seed(42) df = pd.DataFrame(np.random.rand(4,5), columns = list('abcde')) columns = [‘a’, 'b','e'] try: pd.testing.assert_frame_equal(f(df.copy(), columns), g(df.copy(), columns)) print('Test passed!') except: print('Test failed!') A6*: Problem: I'm wondering if there is a simpler, memory efficient way to select a subset of rows and columns from a pandas DataFrame. For instance, given this dataframe: df = DataFrame(np.random.rand(4,5), columns = list('abcde')) print df a b c d e 0 0.945686 0.000710 0.909158 0.892892 0.326670 1 0.919359 0.667057 0.462478 0.008204 0.473096 2 0.976163 0.621712 0.208423 0.980471 0.048334 3 0.459039 0.788318 0.309892 0.100539 0.753992 I want only those rows in which the value for column 'c' is greater than 0.5, but I only need columns 'b' and 'e' for those rows. This is the method that I've come up with - perhaps there is a better "pandas" way? locs = [df.columns.get_loc(_) for _ in ['a', 'd']] print df[df.c > 0.5][locs] a d 0 0.945686 0.892892 My final goal is to convert the result to a numpy array. I wonder if there is a rather convenient way to do the job. Any help would be appreciated. Code: import pandas as pd def f(df, columns): ### BEGIN SOLUTION [insert] ### END SOLUTION return result test: import numpy as np def g(df, columns): return df.loc[df['c']>0.5,columns].to_numpy() np.random.seed(42) df = pd.DataFrame(np.random.rand(4,5), columns = list('abcde')) columns = ['b','e'] try: assert(type(f(df.copy(), columns) == np.ndarray)) np.testing.assert_array_equal(f(df.copy(), columns), g(df.copy(), columns)) print('Test passed!') except: print('Test failed!') A7: Problem: I'm wondering if there is a simpler, memory efficient way to select a subset of rows and columns from a pandas DataFrame, then compute and append sum of the two columns for each element to the right of original columns. For instance, given this dataframe: df = DataFrame(np.random.rand(4,5), columns = list('abcde')) print df a b c d e 0 0.945686 0.000710 0.909158 0.892892 0.326670 1 0.919359 0.667057 0.462478 0.008204 0.473096 2 0.976163 0.621712 0.208423 0.980471 0.048334 3 0.459039 0.788318 0.309892 0.100539 0.753992 I want only those rows in which the value for column 'c' is greater than 0.5, but I only need columns 'b' and 'e' for those rows. This is the method that I've come up with - perhaps there is a better "pandas" way? locs = [df.columns.get_loc(_) for _ in ['a', 'd']] print df[df.c > 0.5][locs] a d 0 0.945686 0.892892 My final goal is to add a column later. The desired output should be a d sum 0 0.945686 0.892892 1.838578 Code: import pandas as pd def f(df, columns): ### BEGIN SOLUTION [insert] ### END SOLUTION return result test: import numpy as np def g(df, columns): ans = df[df.c > 0.5][columns] ans['sum'] = ans.sum(axis=1) return ans np.random.seed(42) df = pd.DataFrame(np.random.rand(4,5), columns = list('abcde')) columns = ['b','e'] try: pd.testing.assert_frame_equal(f(df.copy(), columns), g(df.copy(), columns)) print('Test passed!') except: print('Test failed!') A8: Problem: I'm wondering if there is a simpler, memory efficient way to select a subset of rows and columns from a pandas DataFrame. For instance, given this dataframe: df = DataFrame(np.random.rand(4,5), columns = list('abcde')) print df a b c d e 0 0.945686 0.000710 0.909158 0.892892 0.326670 1 0.919359 0.667057 0.462478 0.008204 0.473096 2 0.976163 0.621712 0.208423 0.980471 0.048334 3 0.459039 0.788318 0.309892 0.100539 0.753992 I want only those rows in which the value for column 'c' is greater than 0.5, but I only need columns 'b' and 'e' for those rows. This is the method that I've come up with - perhaps there is a better "pandas" way? locs = [df.columns.get_loc(_) for _ in ['a', 'd']] print df[df.c > 0.5][locs] a d 0 0.945686 0.892892 From my perspective of view, perhaps using df.ix[df.c > 0.5][locs] could succeed, since our task is trying to find elements that satisfy the requirements, and df.ix is used to find elements using indexes. Any help would be appreciated. Code: def f(df, columns): ### BEGIN SOLUTION [insert] ### END SOLUTION return result test: def g(df, columns): return df.loc[df['c']>0.5,columns] np.random.seed(42) df = DataFrame(np.random.rand(4,5), columns = list('abcde')) columns = ['b','e'] try: np.testing.assert_array_equal(f(df.copy(), columns), g(df.copy(), columns)) print('Test passed!') except: print('Test failed!') html:

I'm wondering if there is a simpler, memory efficient way to select a subset of rows and columns from a pandas DataFrame.

For instance, given this dataframe:

df = DataFrame(np.random.rand(4,5), columns = list('abcde'))
print df

          a         b         c         d         e
0  0.945686  0.000710  0.909158  0.892892  0.326670
1  0.919359  0.667057  0.462478  0.008204  0.473096
2  0.976163  0.621712  0.208423  0.980471  0.048334
3  0.459039  0.788318  0.309892  0.100539  0.753992

I want only those rows in which the value for column 'c' is greater than 0.5, but I only need columns 'b' and 'e' for those rows.

This is the method that I've come up with - perhaps there is a better "pandas" way?

locs = [df.columns.get_loc(_) for _ in ['a', 'd']]
print df[df.c > 0.5][locs]

          a         d
0  0.945686  0.892892

My final goal is to convert the result to a numpy array to pass into an sklearn regression algorithm, so I will use the code above like this:

training_set = array(df[df.c > 0.5][locs])

... and that peeves me since I end up with a huge array copy in memory. Perhaps there's a better way for that too?

A: import pandas as pd import numpy as np df = pd.DataFrame(np.random.rand(4,5), columns = list('abcde')) columns = ['b','e'] ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) test: def g(df, columns): return df.loc[df['c']>0.5,columns] try: pd.testing.assert_frame_equal(result, g(df.copy(), columns)) print('Test passed!') except: print('Test failed!') 12. index: 2015 url: https://stackoverflow.com/questions/46622869/pandas-groupby-column-a-and-make-lists-of-tuples-from-other-columns Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 0 0 0 0 0 1 0 0 1 0 1 0.2 Function 0 0 0 0 0 0 0 0 0 0 0 0 A2 0 0 0 0 0 0 0 0 0 0 0 0 A7 0 0 0 0 0 0 0 0 0 0 0 0 Origin: Problem: I would like to aggregate user transactions into lists in pandas. I can't figure out how to make a list comprised of more than one field. For example, df = pd.DataFrame({'user':[1,1,2,2,3], 'time':[20,10,11,18, 15], 'amount':[10.99, 4.99, 2.99, 1.99, 10.99]}) which looks like amount time user 0 10.99 20 1 1 4.99 10 1 2 2.99 11 2 3 1.99 18 2 4 10.99 15 3 If I do print(df.groupby('user')['time'].apply(list)) I get user 1 [20, 10] 2 [11, 18] 3 [15] but if I do df.groupby('user')[['time', 'amount']].apply(list) I get user 1 [time, amount] 2 [time, amount] 3 [time, amount] Thanks to an answer below, I learned I can do this df.groupby('user').agg(lambda x: x.tolist())) to get amount time user 1 [10.99, 4.99] [20, 10] 2 [2.99, 1.99] [11, 18] 3 [10.99] [15] but I'm going to want to sort time and amounts in the same order - so I can go through each users transactions in order. I was looking for a way to produce this: amount-time-tuple user 1 [(20, 10.99), (10, 4.99)] 2 [(11, 2.99), (18, 1.99)] 3 [(15, 10.99)] but maybe there is a way to do the sort without "tupling" the two columns? A: import pandas as pd df = pd.DataFrame({'user':[1,1,2,2,3], 'time':[20,10,11,18, 15], 'amount':[10.99, 4.99, 2.99, 1.99, 10.99]}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): return df.groupby('user')[['time', 'amount']].apply(lambda x: x.values.tolist()) df = pd.DataFrame({'user':[1,1,2,2,3], 'time':[20,10,11,18, 15], 'amount':[10.99, 4.99, 2.99, 1.99, 10.99]}) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) 13. index: 2026 url: https://stackoverflow.com/questions/20180324/bin-pandas-dataframe-by-every-x-rows Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 0 1 0 0 0 0 0 1 1 1 1 0.4 Function 0 0 1 1 1 0 1 0 0 0 1 0.4 A2 0 0 0 0 0 0 0 0 0 0 0 0 A3 1 1 0 1 0 1 0 1 1 1 1 0.7 A7 0 0 0 0 0 0 0 0 0 0 0 0 Origin: Problem: I have a simple dataframe which I would like to bin for every 3 rows. It looks like this: col1 0 2 1 1 2 3 3 1 4 0 and I would like to turn it into this: col1 0 2 1 0.5 I have already posted a similar question here but I have no Idea how to port the solution to my current use case. Can you help me out? Many thanks! A: import pandas as pd df = pd.DataFrame({'col1':[2, 1, 3, 1, 0]}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): return df.groupby(df.index // 3).mean() print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) Function: Problem: I have a simple dataframe which I would like to bin for every 3 rows. It looks like this: col1 0 2 1 1 2 3 3 1 4 0 and I would like to turn it into this: col1 0 2 1 0.5 I have already posted a similar question here but I have no Idea how to port the solution to my current use case. Can you help me out? Many thanks! A: import pandas as pd def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return result Test: def g(df): return df.groupby(df.index // 3).mean() df = pd.DataFrame({'col1':[2, 1, 3, 1, 0]}) print(f(df.copy())) print(pd.testing.assert_frame_equal(g(df.copy()), f(df.copy()), check_dtype=False)) A2: Problem: I have a simple dataframe which I would like to bin for every 3 rows. It looks like this: col1 0 1 1 1 2 4 3 5 4 1 and I would like to turn it into this: col1 0 2 1 2 I have already posted a similar question here but I have no Idea how to port the solution to my current use case. Can you help me out? Many thanks! A: import pandas as pd df = pd.DataFrame({'col1':[1, 1, 4, 5, 1]}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): return df.groupby(df.index // 3).mean() print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) A3: Problem: I have a simple dataframe which I would like to bin for every 4 rows. It looks like this: col1 0 1 1 1 2 4 3 5 4 1 5 4 and I would like to turn it into this: col1 0 11 1 5 I have already posted a similar question here but I have no Idea how to port the solution to my current use case. Can you help me out? Many thanks! A: import pandas as pd df = pd.DataFrame({'col1':[1, 1, 4, 5, 1, 4]}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): return df.groupby(df.index // 4).sum() print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) A4: Problem: I have a simple dataframe which I would like to bin for every 3 rows from back to front. It looks like this: col1 0 2 1 1 2 3 3 1 4 0 and I would like to turn it into this: col1 0 1.5 1 1.333 I have already posted a similar question here but I have no Idea how to port the solution to my current use case. Can you help me out? Many thanks! A: import pandas as pd df = pd.DataFrame({'col1':[2, 1, 3, 1, 0]}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): return df.groupby((df.index+(-df.size % 3)) // 3).mean() print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) 14. index: 2042 url: https://stackoverflow.com/questions/44663903/pandas-split-column-of-lists-of-unequal-length-into-multiple-columns Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 0 0 1 1 0 0 0 0 0 0 1 0.2 Function A2 A3 A7 Origin: Problem: I have a Pandas dataframe that looks like the below: codes 1 [71020] 2 [77085] 3 [36415] 4 [99213, 99287] 5 [99233, 99233, 99233] I'm trying to split the lists in df['codes'] into columns, like the below: code_1 code_2 code_3 1 71020 2 77085 3 36415 4 99213 99287 5 99233 99233 99233 where columns that don't have a value (because the list was not that long) are filled with blanks or NaNs or something. I've seen answers like this one and others similar to it, and while they work on lists of equal length, they all throw errors when I try to use the methods on lists of unequal length. Is there a good way do to this? A: import pandas as pd df = pd.DataFrame({'codes':[[71020], [77085], [36415], [99213, 99287], [99233, 99233, 99233]]}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): return df.codes.apply(pd.Series).add_prefix('code_') print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) 15. index: 3001 url: https://stackoverflow.com/questions/45243291/parse-pandas-multiindex-to-datetime Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 1 1 1 1 1 1 1 1 1 1 1 1 Function 0 0 0 0 0 0 0 0 0 0 0 0 A1 0 0 0 0 0 0 0 0 1 0 1 0.1 A2 0 0 0 0 0 0 0 0 0 0 0 0 A3 A4 A5 A6 1 1 0 0 0 1 1 1 1 0 1 0.6 A7 0 0 1 0 0 0 0 0 0 0 1 0.1 A8 html 1 1 1 1 1 1 1 1 1 1 1 1 Origin: Problem: I have multi-index df as follows x y id date abc 3/1/1994 100 7 9/1/1994 90 8 3/1/1995 80 9 Where dates are stored as str. I want to parse date index. The following statement df.index.levels[1] = pd.to_datetime(df.index.levels[1]) returns error: TypeError: 'FrozenList' does not support mutable operations. Code: import pandas as pd index = pd.MultiIndex.from_tuples([('abc', '3/1/1994'), ('abc', '9/1/1994'), ('abc', '3/1/1995')], names=('id', 'date')) df = pd.DataFrame({'x': [100, 90, 80], 'y':[7, 8, 9]}, index=index) ### BEGIN SOLUTION [insert] ### END SOLUTION result = df print(result) test: def g(df): df.index = df.index.set_levels([df.index.levels[0], pd.to_datetime(df.index.levels[1])]) return df index = pd.MultiIndex.from_tuples([('abc', '3/1/1994'), ('abc', '9/1/1994'), ('abc', '3/1/1995')], names=('id', 'date')) df = pd.DataFrame({'x': [100, 90, 80], 'y':[7, 8, 9]}, index=index) try: pd.testing.assert_frame_equal(result, g(df.copy())) print('Test passed!') except: print('Test failed!') Function: Problem: I have multi-index df as follows x y id date abc 3/1/1994 100 7 9/1/1994 90 8 3/1/1995 80 9 Where dates are stored as str. I want to parse date index. The following statement df.index.levels[1] = pd.to_datetime(df.index.levels[1]) returns error: TypeError: 'FrozenList' does not support mutable operations. Code: import pandas as pd def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return df test: def g(df): df.index = df.index.set_levels([df.index.levels[0], pd.to_datetime(df.index.levels[1])]) return df index = pd.MultiIndex.from_tuples([('abc', '3/1/1994'), ('abc', '9/1/1994'), ('abc', '3/1/1995')], names=('id', 'date')) df = pd.DataFrame({'x': [100, 90, 80], 'y':[7, 8, 9]}, index=index) try: pd.testing.assert_frame_equal(f(df.copy()), g(df.copy())) print('Test passed!') except: print('Test failed!') A1: Problem: I have multi-index df as follows x y id date abc 3/1/1994 100 7 9/1/1994 90 8 3/1/1995 80 9 Where dates are stored as str. I want to parse date index. Any help would be appreciated. Code: import pandas as pd def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return df test: def g(df): df.index = df.index.set_levels([df.index.levels[0], pd.to_datetime(df.index.levels[1])]) return df index = pd.MultiIndex.from_tuples([('abc', '3/1/1994'), ('abc', '9/1/1994'), ('abc', '3/1/1995')], names=('id', 'date')) df = pd.DataFrame({'x': [100, 90, 80], 'y':[7, 8, 9]}, index=index) try: pd.testing.assert_frame_equal(f(df.copy()), g(df.copy())) print('Test passed!') except: print('Test failed!') Main “fault”: name lost / mismatch A2: Problem: I have multi-index df as follows fee credits name datetime abc 3/1/1994 100 7 9/1/1994 90 8 3/1/1995 80 9 Where dates are stored as str. I want to parse datetimw index. The following statement df.index.levels[1] = pd.to_datetime(df.index.levels[1]) returns error: TypeError: 'FrozenList' does not support mutable operations. Code: import pandas as pd def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return df test: def g(df): df.index = df.index.set_levels([df.index.levels[0], pd.to_datetime(df.index.levels[1])]) return df index = pd.MultiIndex.from_tuples([('abc', '3/1/1994'), ('abc', '9/1/1994'), ('abc', '3/1/1995')], names=('name', 'datetime')) df = pd.DataFrame({'fee': [100, 90, 80], 'credits':[7, 8, 9]}, index=index) try: pd.testing.assert_frame_equal(f(df.copy()), g(df.copy())) print('Test passed!') except: print('Test failed!') main fault: mimic wrong code given in the description. A6: Problem: I have multi-index df as follows x y id date abc 3/1/1994 100 7 9/1/1994 90 8 3/1/1995 80 9 Where dates are stored as str. I want to parse date index, and I want a numpy array as the output. Any help would be appreciated. Code: import pandas as pd def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return df test: import numpy as np def g(df): df.index = df.index.set_levels([df.index.levels[0], pd.to_datetime(df.index.levels[1])]) return df.to_numpy() index = pd.MultiIndex.from_tuples([('abc', '3/1/1994'), ('abc', '9/1/1994'), ('abc', '3/1/1995')], names=('id', 'date')) df = pd.DataFrame({'x': [100, 90, 80], 'y':[7, 8, 9]}, index=index) try: np.testing.assert_array_equal(f(df.copy()), g(df.copy())) print('Test passed!') except: print('Test failed!') A7: Problem: I have multi-index df as follows x y date id 3/1/1994 abc 100 7 9/1/1994 abc 90 8 3/1/1995 abc 80 9 Where dates are stored as str. I want to parse date index using pd.to_datetime, and swap the two levels. The final output should be x y id date abc 1994-03-01 100 7 1994-09-01 90 8 1995-03-01 80 9 Any help would be appreciated. Code: import pandas as pd def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return df test: def g(df): df.index = df.index.from_tuples([(x[1], pd.to_datetime(x[0])) for x in df.index.values], names = [df.index.names[1], df.index.names[0]]) return df index = pd.MultiIndex.from_tuples([('3/1/1994', 'abc'), ('9/1/1994', 'abc'), ( '3/1/1995', 'abc')], names=('date', 'id')) df = pd.DataFrame({'x': [100, 90, 80], 'y':[7, 8, 9]}, index=index) try: pd.testing.assert_frame_equal(f(df.copy()), g(df.copy())) print('Test passed!') except: print('Test failed!') html:

I have multi-index df as follows

                x  y
id  date            
abc 3/1/1994  100  7
    9/1/1994   90  8
    3/1/1995   80  9

Where dates are stored as str.

I want to parse date index. The following statement

df.index.levels[1] = pd.to_datetime(df.index.levels[1])

returns error:

TypeError: 'FrozenList' does not support mutable operations.
A: # import pandas as pd index = pd.MultiIndex.from_tuples([('abc', '3/1/1994'), ('abc', '9/1/1994'), ('abc', '3/1/1995')], names=('id', 'date')) df = pd.DataFrame({'x': [100, 90, 80], 'y':[7, 8, 9]}, index=index) ### BEGIN SOLUTION [insert] ### END SOLUTION result = df print(result) # test: def g(df): df.index = df.index.set_levels([df.index.levels[0], pd.to_datetime(df.index.levels[1])]) return df index = pd.MultiIndex.from_tuples([('abc', '3/1/1994'), ('abc', '9/1/1994'), ('abc', '3/1/1995')], names=('id', 'date')) df = pd.DataFrame({'x': [100, 90, 80], 'y':[7, 8, 9]}, index=index) try: pd.testing.assert_frame_equal(result, g(df.copy())) print('Test passed!') except: print('Test failed!') 16. index: 2059 url: https://stackoverflow.com/questions/18722786/how-to-offset-shift-a-pandas-dataframe-into-another-year Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 0 0 0 0 0 0 0 0 0 0 0 0 Function A2 A3 A7 Origin: Problem: I have the following 15 minute data as a dataframe for 3 years. With the first two columns being the index. 2014-01-01 00:15:00 1269.6 2014-01-01 00:30:00 1161.6 2014-01-01 00:45:00 1466.4 2014-01-01 01:00:00 1365.6 2014-01-01 01:15:00 1362.6 2014-01-01 01:30:00 1064.0 2014-01-01 01:45:00 1171.2 2014-01-01 02:00:00 1171.0 2014-01-01 02:15:00 1330.4 2014-01-01 02:30:00 1309.6 2014-01-01 02:45:00 1308.4 2014-01-01 03:00:00 1494.0 I have used resample to get a second series with monthly averages. data_Monthly = data.resample('1M', how='mean') How can I divide the values in the last column by their monthly average with the result being still a time series on 15 minute granularity? A: import pandas as pd import numpy as np t = np.random.randn(10, 1) df = pd.DataFrame(t, index=pd.date_range('20140101 00:15:00', freq='15T', periods=10)) ### BEGIN SOLUTION [insert] ### END SOLUTION result = df print(result) Test: def g(df): df.index = df.index-pd.offsets.Day(365) return df df = pd.DataFrame(t, index=pd.date_range('20140101 00:15:00', freq='15T', periods=10)) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) 17. index: 3009 url: https://stackoverflow.com/questions/17679089/pandas-dataframe-groupby-two-columns-and-get-counts Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 0 0 0 0 1 1 1 0 1 1 1 0.5 Function 0 0 0 1 0 0 0 0 1 0 0 0.2 A1 0 0 1 0 0 1 0 0 0 0 1 0.2 A2 1 0 0 0 0 0 0 0 0 0 1 0.1 A3 0 1 0 0 0 0 0 0 0 0 1 0.1 A4 0 0 0 0 0 0 0 0 0 0 0 0 A5 A6 A7 0 1 0 0 0 0 0 0 0 1 1 0.2 A8 html 0 1 1 1 0 1 1 1 1 1 1 0.8 Origin: Problem: I have a pandas dataframe(df) like this Close Close Close Close Close Date 2000-01-03 00:00:00 NaN NaN NaN NaN -0.033944 2000-01-04 00:00:00 NaN NaN NaN NaN 0.0351366 2000-01-05 00:00:00 -0.033944 NaN NaN NaN -0.0172414 2000-01-06 00:00:00 0.0351366 -0.033944 NaN NaN -0.00438596 2000-01-07 00:00:00 -0.0172414 0.0351366 -0.033944 NaN 0.0396476 in R If I want to select fifth column five=df[,5] and without 5th column rest=df[,-5] How can I do similar operations with pandas dataframe I tried this in pandas five=df.ix[,5] but its giving this error File "", line 1 df.ix[,5] ^ SyntaxError: invalid syntax Code: import pandas as pd import io data = io.StringIO(""" Date Close Close Close Close Close 2000-01-03-00:00:00 NaN NaN NaN NaN -0.033944 2000-01-04-00:00:00 NaN NaN NaN NaN 0.0351366 2000-01-05-00:00:00 -0.033944 NaN NaN NaN -0.0172414 2000-01-06-00:00:00 0.0351366 -0.033944 NaN NaN -0.00438596 2000-01-07-00:00:00 -0.0172414 0.0351366 -0.033944 NaN 0.0396476 """) df = pd.read_csv(data,delim_whitespace=True, index_col=0) column = 4 ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) test: def g(df, column): return df.iloc[:, column] def h(df, column): return df.iloc[:, [i for i in range(df.shape[1]) if i != column]] try: pd.testing.assert_series_equal(result, g(df.copy(), column)) print('Test passed!') except: try: pd.testing.assert_frame_equal(result, h(df.copy(), column)) print('Test passed!') except: print('Test failed!') Function: Problem: I have a pandas dataframe(df) like this Close Close Close Close Close Date 2000-01-03 00:00:00 NaN NaN NaN NaN -0.033944 2000-01-04 00:00:00 NaN NaN NaN NaN 0.0351366 2000-01-05 00:00:00 -0.033944 NaN NaN NaN -0.0172414 2000-01-06 00:00:00 0.0351366 -0.033944 NaN NaN -0.00438596 2000-01-07 00:00:00 -0.0172414 0.0351366 -0.033944 NaN 0.0396476 in R If I want to select fifth column five=df[,5] and without 5th column rest=df[,-5] How can I do similar operations with pandas dataframe I tried this in pandas five=df.ix[,5] but its giving this error File "", line 1 df.ix[,5] ^ SyntaxError: invalid syntax Code: import pandas as pd def f(df, column): ### BEGIN SOLUTION [insert] ### END SOLUTION return result test: import io def g(df, column): return df.iloc[:, column] def h(df, column): return df.iloc[:, [i for i in range(df.shape[1]) if i != column]] data = io.StringIO(""" Date Close Close Close Close Close 2000-01-03-00:00:00 NaN NaN NaN NaN -0.033944 2000-01-04-00:00:00 NaN NaN NaN NaN 0.0351366 2000-01-05-00:00:00 -0.033944 NaN NaN NaN -0.0172414 2000-01-06-00:00:00 0.0351366 -0.033944 NaN NaN -0.00438596 2000-01-07-00:00:00 -0.0172414 0.0351366 -0.033944 NaN 0.0396476 """) df = pd.read_csv(data,delim_whitespace=True, index_col=0) column = 4 try: pd.testing.assert_series_equal(f(df.copy(), column), g(df.copy(), column)) print('Test passed!') except: try: pd.testing.assert_frame_equal((f(df.copy(), column), h(df.copy(), column)) print('Test passed!') except: print('Test failed!') A1: Problem: I have a pandas dataframe(df) like this Close1 Close2 Close3 Close4 Close5 Date 2000-01-03 00:00:00 NaN NaN NaN NaN -0.033944 2000-01-04 00:00:00 NaN NaN NaN NaN 0.0351366 2000-01-05 00:00:00 -0.033944 NaN NaN NaN -0.0172414 2000-01-06 00:00:00 0.0351366 -0.033944 NaN NaN -0.00438596 2000-01-07 00:00:00 -0.0172414 0.0351366 -0.033944 NaN 0.0396476 I want to get the fifth column of the dataframe, namely ‘Close5’, but I don’t know how to get the answer. The thing I’ve tried is: five=df.ix[,4] but it tells me that df.ix is out-of-version. Any help would be appreciated. Code: import pandas as pd def f(df, column_index): ### BEGIN SOLUTION [insert] ### END SOLUTION return result test: import io def g(df, column): return df.iloc[:, column] def h(df, column): return df.iloc[:, [i for i in range(df.shape[1]) if i != column]] data = io.StringIO(""" Date Close Close Close Close Close 2000-01-03-00:00:00 NaN NaN NaN NaN -0.033944 2000-01-04-00:00:00 NaN NaN NaN NaN 0.0351366 2000-01-05-00:00:00 -0.033944 NaN NaN NaN -0.0172414 2000-01-06-00:00:00 0.0351366 -0.033944 NaN NaN -0.00438596 2000-01-07-00:00:00 -0.0172414 0.0351366 -0.033944 NaN 0.0396476 """) df = pd.read_csv(data,delim_whitespace=True, index_col=0) column = 4 try: pd.testing.assert_series_equal(f(df.copy(), column), g(df.copy(), column)) print('Test passed!') except: try: pd.testing.assert_frame_equal((f(df.copy(), column), h(df.copy(), column)) print('Test passed!') except: print('Test failed!') A2: Problem: I have a pandas dataframe(df) like this Close1 Close2 Close3 Date 2000-01-05 00:00:00 -0.033944 NaN NaN 2000-01-06 00:00:00 0.0351366 -0.033944 NaN 2000-01-07 00:00:00 -0.0172414 0.0351366 -0.033944 I want to get the third column of the dataframe, namely ‘Close3’, but I don’t know how to get the answer. The thing I’ve tried is: five=df.ix[,3] but it tells me that df.ix is out-of-version. Any help would be appreciated. Code: import pandas as pd def f(df, column_num): ### BEGIN SOLUTION [insert] ### END SOLUTION return result test: import io def g(df, column): return df.iloc[:, column] def h(df, column): return df.iloc[:, [i for i in range(df.shape[1]) if i != column]] data = io.StringIO(""" Date Close Close Close 2000-01-05-00:00:00 -0.033944 NaN NaN 2000-01-06-00:00:00 0.0351366 -0.033944 NaN 2000-01-07-00:00:00 -0.0172414 0.0351366 -0.033944 """) df = pd.read_csv(data,delim_whitespace=True, index_col=0) column = 3 try: pd.testing.assert_series_equal(f(df.copy(), column), g(df.copy(), column)) print('Test passed!') except: try: pd.testing.assert_frame_equal((f(df.copy(), column), h(df.copy(), column)) print('Test passed!') except: print('Test failed!') A3: Problem: I have a pandas dataframe(df) like this Close Close Close Close Close Date 2000-01-03 00:00:00 NaN NaN NaN NaN -0.033944 2000-01-04 00:00:00 NaN NaN NaN NaN 0.0351366 2000-01-05 00:00:00 -0.033944 NaN NaN NaN -0.0172414 2000-01-06 00:00:00 0.0351366 -0.033944 NaN NaN -0.00438596 2000-01-07 00:00:00 -0.0172414 0.0351366 -0.033944 NaN 0.0396476 in R If I want to select fifth row five=df[5,] and without 5th row rest=df[-5,] How can I do similar operations with pandas dataframe I tried this in pandas five=df.ix[5,] but its giving this error File "", line 1 df.ix[5,] ^ SyntaxError: invalid syntax Code: import pandas as pd def f(df, ith_row): ### BEGIN SOLUTION [insert] ### END SOLUTION return result test: import io def g(df, row): return df.iloc[row-1,:] data = io.StringIO(""" Date Close Close Close Close Close 2000-01-03-00:00:00 NaN NaN NaN NaN -0.033944 2000-01-04-00:00:00 NaN NaN NaN NaN 0.0351366 2000-01-05-00:00:00 -0.033944 NaN NaN NaN -0.0172414 2000-01-06-00:00:00 0.0351366 -0.033944 NaN NaN -0.00438596 2000-01-07-00:00:00 -0.0172414 0.0351366 -0.033944 NaN 0.0396476 """) df = pd.read_csv(data,delim_whitespace=True, index_col=0) row = 5 try: pd.testing.assert_series_equal(f(df.copy(), row), g(df.copy(), row)) print('Test passed!') except: print('Test failed!') A4: Problem: I have a pandas dataframe(df) like this Close Close Close Close Close Date 2000-01-03 00:00:00 NaN NaN NaN NaN -0.033944 2000-01-04 00:00:00 NaN NaN NaN NaN 0.0351366 2000-01-05 00:00:00 -0.033944 NaN NaN NaN -0.0172414 2000-01-06 00:00:00 0.0351366 -0.033944 NaN NaN -0.00438596 2000-01-07 00:00:00 -0.0172414 0.0351366 -0.033944 NaN 0.0396476 in R If I want to select third column five=df[,3] and without 3rd column rest=df[,-3] How can I do similar operations with pandas dataframe I tried this in pandas five=df.ix[,3] but its giving this error File "", line 1 df.ix[,3] ^ SyntaxError: invalid syntax Code: import pandas as pd def f(df, ith_column): ### BEGIN SOLUTION [insert] ### END SOLUTION return result test: import io def g(df, column): return df.iloc[:,column-1] data = io.StringIO(""" Date Close Close Close Close Close 2000-01-03-00:00:00 NaN NaN NaN NaN -0.033944 2000-01-04-00:00:00 NaN NaN NaN NaN 0.0351366 2000-01-05-00:00:00 -0.033944 NaN NaN NaN -0.0172414 2000-01-06-00:00:00 0.0351366 -0.033944 NaN NaN -0.00438596 2000-01-07-00:00:00 -0.0172414 0.0351366 -0.033944 NaN 0.0396476 """) df = pd.read_csv(data,delim_whitespace=True, index_col=0) column = 3 try: pd.testing.assert_series_equal(f(df.copy(), column), g(df.copy(), column)) print('Test passed!') except: print('Test failed!') html:

I have a pandas dataframe(df) like this

                         Close      Close     Close Close       Close
Date                                                                 
2000-01-03 00:00:00        NaN        NaN       NaN   NaN   -0.033944
2000-01-04 00:00:00        NaN        NaN       NaN   NaN   0.0351366
2000-01-05 00:00:00  -0.033944        NaN       NaN   NaN  -0.0172414
2000-01-06 00:00:00  0.0351366  -0.033944       NaN   NaN -0.00438596
2000-01-07 00:00:00 -0.0172414  0.0351366 -0.033944   NaN   0.0396476

in R If I want to select fifth column

five=df[,5]

and without 5th column

rest=df[,-5]

How can I do similar operations with pandas dataframe

I tried this in pandas

five=df.ix[,5]

but its giving this error

 File "", line 1
    df.ix[,5]
           ^
SyntaxError: invalid syntax
A: # import pandas as pd import io data = io.StringIO(""" Date Close Close Close Close Close 2000-01-03-00:00:00 NaN NaN NaN NaN -0.033944 2000-01-04-00:00:00 NaN NaN NaN NaN 0.0351366 2000-01-05-00:00:00 -0.033944 NaN NaN NaN -0.0172414 2000-01-06-00:00:00 0.0351366 -0.033944 NaN NaN -0.00438596 2000-01-07-00:00:00 -0.0172414 0.0351366 -0.033944 NaN 0.0396476 """) df = pd.read_csv(data,delim_whitespace=True, index_col=0) column = 5 ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) # test: def g(df, column): return df.iloc[:, column] def h(df, column): return df.iloc[:, [i for i in range(df.shape[1]) if i != column]] try: pd.testing.assert_series_equal(result, g(df.copy(), column)) print('Test passed!') except: try: pd.testing.assert_frame_equal(result, h(df.copy(), column)) print('Test passed!') except: print('Test failed!') 18. index: 2072 url: https://stackoverflow.com/questions/40397067/how-to-do-a-pandas-groupby-operation-on-one-column-but-keep-the-other-in-the-res Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 0 0 0 0 0 0 0 0 0 0 0 0 Function A2 A3 A7 Origin: Problem: My question is about groupby operation with pandas. I have the following DataFrame : In [4]: df = pd.DataFrame({"A": range(4), "B": ["PO", "PO", "PA", "PA"], "C": ["Est", "Est", "West", "West"]}) In [5]: df Out[5]: A B C 0 0 PO Est 1 1 PO Est 2 2 PA West 3 3 PA West This is what I would like to do : I want to group by column B and do a sum on column A. But at the end, I would like column C to still be in the DataFrame. If I do : In [8]: df.groupby(by="B").aggregate(pd.np.sum) Out[8]: A B PA 5 PO 1 It does the job but column C is missing. I can also do this : In [9]: df.groupby(by=["B", "C"]).aggregate(pd.np.sum) Out[9]: A B C PA West 5 PO Est 1 or In [11]: df.groupby(by=["B", "C"], as_index=False).aggregate(pd.np.sum) Out[11]: B C A 0 PA West 5 1 PO Est 1 But in both cases it group by B AND C and not just B and keeps the C value. Is what I want to do irrelevant or is there a way to do it ? A: import pandas as pd df = pd.DataFrame({"A": range(4), "B": ["PO", "PO", "PA", "PA"], "C": ["Est", "Est", "West", "West"]}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): return df.groupby('B').agg({'A':'sum', 'C':'first'}) df = pd.DataFrame({"A": range(4), "B": ["PO", "PO", "PA", "PA"], "C": ["Est", "Est", "West", "West"]}) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) 19. index:3001 Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 1 1 1 1 1 1 1 1 1 1 1 1 Function 0 0 0 0 0 0 0 0 0 0 0 0 A1 0 0 0 0 0 0 0 0 1 0 1 0.1 A2 0 0 0 0 0 0 0 0 0 0 0 0 A3 A4 A5 A6 1 1 0 0 0 1 1 1 1 0 1 0.6 A7 0 0 1 0 0 0 0 0 0 0 1 0.1 A8 html 1 1 1 1 1 1 1 1 1 1 1 1 Origin: Problem: I have multi-index df as follows x y id date abc 3/1/1994 100 7 9/1/1994 90 8 3/1/1995 80 9 Where dates are stored as str. I want to parse date index. The following statement df.index.levels[1] = pd.to_datetime(df.index.levels[1]) returns error: TypeError: 'FrozenList' does not support mutable operations. Code: import pandas as pd index = pd.MultiIndex.from_tuples([('abc', '3/1/1994'), ('abc', '9/1/1994'), ('abc', '3/1/1995')], names=('id', 'date')) df = pd.DataFrame({'x': [100, 90, 80], 'y':[7, 8, 9]}, index=index) ### BEGIN SOLUTION [insert] ### END SOLUTION result = df print(result) test: def g(df): df.index = df.index.set_levels([df.index.levels[0], pd.to_datetime(df.index.levels[1])]) return df index = pd.MultiIndex.from_tuples([('abc', '3/1/1994'), ('abc', '9/1/1994'), ('abc', '3/1/1995')], names=('id', 'date')) df = pd.DataFrame({'x': [100, 90, 80], 'y':[7, 8, 9]}, index=index) try: pd.testing.assert_frame_equal(result, g(df.copy())) print('Test passed!') except: print('Test failed!') Function: Problem: I have multi-index df as follows x y id date abc 3/1/1994 100 7 9/1/1994 90 8 3/1/1995 80 9 Where dates are stored as str. I want to parse date index. The following statement df.index.levels[1] = pd.to_datetime(df.index.levels[1]) returns error: TypeError: 'FrozenList' does not support mutable operations. Code: import pandas as pd def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return df test: def g(df): df.index = df.index.set_levels([df.index.levels[0], pd.to_datetime(df.index.levels[1])]) return df index = pd.MultiIndex.from_tuples([('abc', '3/1/1994'), ('abc', '9/1/1994'), ('abc', '3/1/1995')], names=('id', 'date')) df = pd.DataFrame({'x': [100, 90, 80], 'y':[7, 8, 9]}, index=index) try: pd.testing.assert_frame_equal(f(df.copy()), g(df.copy())) print('Test passed!') except: print('Test failed!') A1: Problem: I have multi-index df as follows x y id date abc 3/1/1994 100 7 9/1/1994 90 8 3/1/1995 80 9 Where dates are stored as str. I want to parse date index. Any help would be appreciated. Code: import pandas as pd def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return df test: def g(df): df.index = df.index.set_levels([df.index.levels[0], pd.to_datetime(df.index.levels[1])]) return df index = pd.MultiIndex.from_tuples([('abc', '3/1/1994'), ('abc', '9/1/1994'), ('abc', '3/1/1995')], names=('id', 'date')) df = pd.DataFrame({'x': [100, 90, 80], 'y':[7, 8, 9]}, index=index) try: pd.testing.assert_frame_equal(f(df.copy()), g(df.copy())) print('Test passed!') except: print('Test failed!') Main “fault”: name lost / mismatch A2: Problem: I have multi-index df as follows fee credits name datetime abc 3/1/1994 100 7 9/1/1994 90 8 3/1/1995 80 9 Where dates are stored as str. I want to parse datetimw index. The following statement df.index.levels[1] = pd.to_datetime(df.index.levels[1]) returns error: TypeError: 'FrozenList' does not support mutable operations. Code: import pandas as pd def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return df test: def g(df): df.index = df.index.set_levels([df.index.levels[0], pd.to_datetime(df.index.levels[1])]) return df index = pd.MultiIndex.from_tuples([('abc', '3/1/1994'), ('abc', '9/1/1994'), ('abc', '3/1/1995')], names=('name', 'datetime')) df = pd.DataFrame({'fee': [100, 90, 80], 'credits':[7, 8, 9]}, index=index) try: pd.testing.assert_frame_equal(f(df.copy()), g(df.copy())) print('Test passed!') except: print('Test failed!') main fault: mimic wrong code given in the description. A6: Problem: I have multi-index df as follows x y id date abc 3/1/1994 100 7 9/1/1994 90 8 3/1/1995 80 9 Where dates are stored as str. I want to parse date index, and I want a numpy array as the output. Any help would be appreciated. Code: import pandas as pd def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return df test: import numpy as np def g(df): df.index = df.index.set_levels([df.index.levels[0], pd.to_datetime(df.index.levels[1])]) return df.to_numpy() index = pd.MultiIndex.from_tuples([('abc', '3/1/1994'), ('abc', '9/1/1994'), ('abc', '3/1/1995')], names=('id', 'date')) df = pd.DataFrame({'x': [100, 90, 80], 'y':[7, 8, 9]}, index=index) try: np.testing.assert_array_equal(f(df.copy()), g(df.copy())) print('Test passed!') except: print('Test failed!') A7: Problem: I have multi-index df as follows x y date id 3/1/1994 abc 100 7 9/1/1994 abc 90 8 3/1/1995 abc 80 9 Where dates are stored as str. I want to parse date index using pd.to_datetime, and swap the two levels. The final output should be x y id date abc 1994-03-01 100 7 1994-09-01 90 8 1995-03-01 80 9 Any help would be appreciated. Code: import pandas as pd def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return df test: def g(df): df.index = df.index.from_tuples([(x[1], pd.to_datetime(x[0])) for x in df.index.values], names = [df.index.names[1], df.index.names[0]]) return df index = pd.MultiIndex.from_tuples([('3/1/1994', 'abc'), ('9/1/1994', 'abc'), ( '3/1/1995', 'abc')], names=('date', 'id')) df = pd.DataFrame({'x': [100, 90, 80], 'y':[7, 8, 9]}, index=index) try: pd.testing.assert_frame_equal(f(df.copy()), g(df.copy())) print('Test passed!') except: print('Test failed!') html:

I have multi-index df as follows

                x  y
id  date            
abc 3/1/1994  100  7
    9/1/1994   90  8
    3/1/1995   80  9

Where dates are stored as str.

I want to parse date index. The following statement

df.index.levels[1] = pd.to_datetime(df.index.levels[1])

returns error:

TypeError: 'FrozenList' does not support mutable operations.
A: # import pandas as pd index = pd.MultiIndex.from_tuples([('abc', '3/1/1994'), ('abc', '9/1/1994'), ('abc', '3/1/1995')], names=('id', 'date')) df = pd.DataFrame({'x': [100, 90, 80], 'y':[7, 8, 9]}, index=index) ### BEGIN SOLUTION [insert] ### END SOLUTION result = df print(result) # test: def g(df): df.index = df.index.set_levels([df.index.levels[0], pd.to_datetime(df.index.levels[1])]) return df index = pd.MultiIndex.from_tuples([('abc', '3/1/1994'), ('abc', '9/1/1994'), ('abc', '3/1/1995')], names=('id', 'date')) df = pd.DataFrame({'x': [100, 90, 80], 'y':[7, 8, 9]}, index=index) try: pd.testing.assert_frame_equal(result, g(df.copy())) print('Test passed!') except: print('Test failed!') 20. index:3011 Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 1 1 1 1 1 1 1 1 1 1 1 1 Function 1 1 1 1 1 1 1 1 1 1 1 1 A1 1 1 1 1 1 1 1 1 1 1 1 1 A2 1 1 1 1 1 1 1 1 1 1 1 1 A3 1 0 0 0 1 1 1 1 1 1 1 0.7 A4 A5 A6 A7 0 1 0 0 0 0 0 0 0 1 1 0.2 A8 html 1 1 1 1 1 1 1 1 1 1 1 1 html_A7 1 1 0 0 1 0 1 1 0 1 1 0.6 Origin: Problem: I am trying to extract rows from a Pandas dataframe using a list of row names, but it can't be done. Here is an example # df alleles chrom pos strand assembly# center protLSID assayLSID rs# TP3 A/C 0 3 + NaN NaN NaN NaN TP7 A/T 0 7 + NaN NaN NaN NaN TP12 T/A 0 12 + NaN NaN NaN NaN TP15 C/A 0 15 + NaN NaN NaN NaN TP18 C/T 0 18 + NaN NaN NaN NaN test = ['TP3','TP12','TP18'] df.select(test) This is what I was trying to do with just element of the list and I am getting this error TypeError: 'Index' object is not callable. What am I doing wrong? Code: import pandas as pd import io data = io.StringIO(""" rs alleles chrom pos strand assembly# center protLSID assayLSID TP3 A/C 0 3 + NaN NaN NaN NaN TP7 A/T 0 7 + NaN NaN NaN NaN TP12 T/A 0 12 + NaN NaN NaN NaN TP15 C/A 0 15 + NaN NaN NaN NaN TP18 C/T 0 18 + NaN NaN NaN NaN """) df = pd.read_csv(data, delim_whitespace=True).set_index('rs') test = ['TP3', 'TP7', 'TP18'] ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) test: #test function def g(df, test): return df.loc[test] #test case data = io.StringIO(""" rs alleles chrom pos strand assembly# center protLSID assayLSID TP3 A/C 0 3 + NaN NaN NaN NaN TP7 A/T 0 7 + NaN NaN NaN NaN TP12 T/A 0 12 + NaN NaN NaN NaN TP15 C/A 0 15 + NaN NaN NaN NaN TP18 C/T 0 18 + NaN NaN NaN NaN """) df = pd.read_csv(data, delim_whitespace=True).set_index('rs') test = ['TP3', 'TP7', 'TP18'] #testing df2 = g(df, test) try: pd.testing.assert_frame_equal(result, df2) print('Test passed!') except: print('Test failed!') Function: Problem: I am trying to extract rows from a Pandas dataframe using a list of row names, but it can't be done. Here is an example # df alleles chrom pos strand assembly# center protLSID assayLSID rs# TP3 A/C 0 3 + NaN NaN NaN NaN TP7 A/T 0 7 + NaN NaN NaN NaN TP12 T/A 0 12 + NaN NaN NaN NaN TP15 C/A 0 15 + NaN NaN NaN NaN TP18 C/T 0 18 + NaN NaN NaN NaN test = ['TP3','TP12','TP18'] df.select(test) This is what I was trying to do with just element of the list and I am getting this error TypeError: 'Index' object is not callable. What am I doing wrong? Code: import pandas as pd def f(df, test): ### BEGIN SOLUTION [insert] ### END SOLUTION return result test: #test function def g(df, test): return df.loc[test] #test case import io data = io.StringIO(""" rs alleles chrom pos strand assembly# center protLSID assayLSID TP3 A/C 0 3 + NaN NaN NaN NaN TP7 A/T 0 7 + NaN NaN NaN NaN TP12 T/A 0 12 + NaN NaN NaN NaN TP15 C/A 0 15 + NaN NaN NaN NaN TP18 C/T 0 18 + NaN NaN NaN NaN """) df = pd.read_csv(data, delim_whitespace=True).set_index('rs') test = ['TP3', 'TP7', 'TP18'] #testing df1 = f(df, test) df2 = g(df, test) try: pd.testing.assert_frame_equal(df1, df2) print('Test passed!') except: print('Test failed!') A1: Problem: Given a list of row names, I would like to extract these selected rows from a Pandas dataframe. Here is an example # df alleles chrom pos strand assembly# center protLSID assayLSID rs# TP3 A/C 0 3 + NaN NaN NaN NaN TP7 A/T 0 7 + NaN NaN NaN NaN TP12 T/A 0 12 + NaN NaN NaN NaN TP15 C/A 0 15 + NaN NaN NaN NaN TP18 C/T 0 18 + NaN NaN NaN NaN test = ['TP3','TP12','TP18'] Any help would be appreciated. Code: import pandas as pd def f(df, test): ### BEGIN SOLUTION [insert] ### END SOLUTION return result test: #test function def g(df, test): return df.loc[test] #test case import io data = io.StringIO(""" rs alleles chrom pos strand assembly# center protLSID assayLSID TP3 A/C 0 3 + NaN NaN NaN NaN TP7 A/T 0 7 + NaN NaN NaN NaN TP12 T/A 0 12 + NaN NaN NaN NaN TP15 C/A 0 15 + NaN NaN NaN NaN TP18 C/T 0 18 + NaN NaN NaN NaN """) df = pd.read_csv(data, delim_whitespace=True).set_index('rs') test = ['TP3', 'TP7', 'TP18'] #testing df1 = f(df, test) df2 = g(df, test) try: pd.testing.assert_frame_equal(df1, df2) print('Test passed!') except: print('Test failed!') A2: Problem: I am trying to extract rows from a Pandas dataframe using a list of row names, but it can't be done. Here is an example # df alias chrome poston rs# TP3 A/C 0 3 TP7 A/T 0 7 TP12 T/A 0 12 TP15 C/A 0 15 TP18 C/T 0 18 rows = ['TP3', 'TP18'] df.select(rows) This is what I was trying to do with just element of the list and I am getting this error TypeError: 'Index' object is not callable. What am I doing wrong? Code: import pandas as pd def f(df, rows): ### BEGIN SOLUTION [insert] ### END SOLUTION return result test: #test function def g(df, test): return df.loc[test] #test case import io data = io.StringIO(""" rs alias chrome poston TP3 A/C 0 3 TP7 A/T 0 7 TP12 T/A 0 12 TP15 C/A 0 15 TP18 C/T 0 18 """) df = pd.read_csv(data, delim_whitespace=True).set_index('rs') test = ['TP3', 'TP18'] #testing df1 = f(df.copy(), test) df2 = g(df.copy(), test) try: pd.testing.assert_frame_equal(df1, df2) print('Test passed!') except: print('Test failed!') A3: Problem: I am trying to delete rows from a Pandas dataframe using a list of row names, but it can't be done. Here is an example # df alleles chrom pos strand assembly# center protLSID assayLSID rs# TP3 A/C 0 3 + NaN NaN NaN NaN TP7 A/T 0 7 + NaN NaN NaN NaN TP12 T/A 0 12 + NaN NaN NaN NaN TP15 C/A 0 15 + NaN NaN NaN NaN TP18 C/T 0 18 + NaN NaN NaN NaN test = ['TP3','TP12','TP18'] Any help would be appreciated. Code: import pandas as pd def f(df, test): ### BEGIN SOLUTION [insert] ### END SOLUTION return result test: #test function def g(df, test): return df.drop(test, inplace = False) #test case import io data = io.StringIO(""" rs alleles chrom pos strand assembly# center protLSID assayLSID TP3 A/C 0 3 + NaN NaN NaN NaN TP7 A/T 0 7 + NaN NaN NaN NaN TP12 T/A 0 12 + NaN NaN NaN NaN TP15 C/A 0 15 + NaN NaN NaN NaN TP18 C/T 0 18 + NaN NaN NaN NaN """) df = pd.read_csv(data, delim_whitespace=True).set_index('rs') test = ['TP3', 'TP7', 'TP18'] #testing df1 = f(df, test) df2 = g(df, test) try: pd.testing.assert_frame_equal(df1, df2) print('Test passed!') except: print('Test failed!') A7: Problem: I am trying to extract rows from a Pandas dataframe using a list of row names according to the order of the list, but it can't be done. Note that the list might contain duplicate row names, and I just want the row occurs once. Here is an example # df alleles chrom pos strand assembly# center protLSID assayLSID rs# TP3 A/C 0 3 + NaN NaN NaN NaN TP7 A/T 0 7 + NaN NaN NaN NaN TP12 T/A 0 12 + NaN NaN NaN NaN TP15 C/A 0 15 + NaN NaN NaN NaN TP18 C/T 0 18 + NaN NaN NaN NaN test = ['TP3','TP12','TP18', ‘TP3’] df.select(test) This is what I was trying to do with just element of the list and I am getting this error TypeError: 'Index' object is not callable. What am I doing wrong? Code: def f(df, test): ### BEGIN SOLUTION [insert] ### END SOLUTION return result test: #test function def g(df, test): return df.loc[df.index.isin(test)] #test case data = io.StringIO(""" rs alleles chrom pos strand assembly# center protLSID assayLSID TP3 A/C 0 3 + NaN NaN NaN NaN TP7 A/T 0 7 + NaN NaN NaN NaN TP12 T/A 0 12 + NaN NaN NaN NaN TP15 C/A 0 15 + NaN NaN NaN NaN TP18 C/T 0 18 + NaN NaN NaN NaN """) df = pd.read_csv(data, delim_whitespace=True).set_index('rs') test = ['TP3', 'TP7', 'TP18', 'TP3'’] #testing df1 = f(df.copy(), test) df2 = g(df.copy(), test) try: pd.testing.assert_frame_equal(df1, df2) print('Test passed!') except: print('Test failed!') html:

I am trying to extract rows from a Pandas dataframe using a list of row names, but it can't be done. Here is an example

# df
    alleles  chrom  pos strand  assembly#  center  protLSID  assayLSID  
rs#
TP3      A/C      0    3      +        NaN     NaN       NaN        NaN
TP7      A/T      0    7      +        NaN     NaN       NaN        NaN
TP12     T/A      0   12      +        NaN     NaN       NaN        NaN
TP15     C/A      0   15      +        NaN     NaN       NaN        NaN
TP18     C/T      0   18      +        NaN     NaN       NaN        NaN

test = ['TP3','TP12','TP18']

df.select(test)

This is what I was trying to do with just element of the list and I am getting this error TypeError: 'Index' object is not callable. What am I doing wrong?

A: # import pandas as pd import io data = io.StringIO(""" rs alleles chrom pos strand assembly# center protLSID assayLSID TP3 A/C 0 3 + NaN NaN NaN NaN TP7 A/T 0 7 + NaN NaN NaN NaN TP12 T/A 0 12 + NaN NaN NaN NaN TP15 C/A 0 15 + NaN NaN NaN NaN TP18 C/T 0 18 + NaN NaN NaN NaN """) df = pd.read_csv(data, delim_whitespace=True).set_index('rs') test = ['TP3', 'TP7', 'TP18'] ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) # test: #test function def g(df, test): return df.loc[test] #test case data = io.StringIO(""" rs alleles chrom pos strand assembly# center protLSID assayLSID TP3 A/C 0 3 + NaN NaN NaN NaN TP7 A/T 0 7 + NaN NaN NaN NaN TP12 T/A 0 12 + NaN NaN NaN NaN TP15 C/A 0 15 + NaN NaN NaN NaN TP18 C/T 0 18 + NaN NaN NaN NaN """) df = pd.read_csv(data, delim_whitespace=True).set_index('rs') test = ['TP3', 'TP7', 'TP18'] #testing df2 = g(df, test) try: pd.testing.assert_frame_equal(result, df2) print('Test passed!') except: print('Test failed!') html_A7:

I am trying to extract rows from a Pandas dataframe using a list of row names according to the order of the list, but it can't be done. Note that the list might contain duplicate row names, and I just want the row occurs once. Here is an example

# df
    alleles  chrom  pos strand  assembly#  center  protLSID  assayLSID  
rs#
TP3      A/C      0    3      +        NaN     NaN       NaN        NaN
TP7      A/T      0    7      +        NaN     NaN       NaN        NaN
TP12     T/A      0   12      +        NaN     NaN       NaN        NaN
TP15     C/A      0   15      +        NaN     NaN       NaN        NaN
TP18     C/T      0   18      +        NaN     NaN       NaN        NaN

test = ['TP3','TP12','TP18']

df.select(test)

This is what I was trying to do with just element of the list and I am getting this error TypeError: 'Index' object is not callable. What am I doing wrong?

A: # import pandas as pd import io data = io.StringIO(""" rs alleles chrom pos strand assembly# center protLSID assayLSID TP3 A/C 0 3 + NaN NaN NaN NaN TP7 A/T 0 7 + NaN NaN NaN NaN TP12 T/A 0 12 + NaN NaN NaN NaN TP15 C/A 0 15 + NaN NaN NaN NaN TP18 C/T 0 18 + NaN NaN NaN NaN """) df = pd.read_csv(data, delim_whitespace=True).set_index('rs') test = ['TP3', 'TP7', 'TP18', 'TP3'] ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) # test: #test function def g(df, test): return df.loc[df.index.isin(test)] #test case data = io.StringIO(""" rs alleles chrom pos strand assembly# center protLSID assayLSID TP3 A/C 0 3 + NaN NaN NaN NaN TP7 A/T 0 7 + NaN NaN NaN NaN TP12 T/A 0 12 + NaN NaN NaN NaN TP15 C/A 0 15 + NaN NaN NaN NaN TP18 C/T 0 18 + NaN NaN NaN NaN """) df = pd.read_csv(data, delim_whitespace=True).set_index('rs') test = ['TP3', 'TP7', 'TP18', 'TP3'] #testing df2 = g(df, test) try: pd.testing.assert_frame_equal(result, df2) print('Test passed!') except: print('Test failed!') 21. index:3015 url: https://stackoverflow.com/questions/34197519/can-pandas-dataframe-have-list-type-column Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 1 1 1 1 1 1 1 1 1 1 1 1 Function 1 1 1 1 1 1 1 1 1 1 1 1 A2 1 1 1 1 1 1 1 1 1 1 1 1 A3 1 1 1 1 1 1 1 1 1 1 1 1 Origin: Problem: Is it possible to create pandas.DataFrame which includes list type field? For example, I'd like to load the following csv to pandas.DataFrame: id,scores 1,"[1,2,3,4]" 2,"[1,2]" 3,"[0,2,4]" A: import pandas as pd query = [[1,2,3,4], [1,2], [0,2,4]] ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): query = [[1, [1,2,3,4]], [2, [1,2]], [3, [0,2,4]]] return pandas.DataFrame(query, columns=['id', 'scores']) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) 22. index: 3020 url: https://stackoverflow.com/questions/55204418/how-to-rename-categories-after-using-pandas-cut-with-intervalindex Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin Function A2 A3 Origin: Problem: I discretized a column in my dataframe using pandas.cut with bins created by IntervalIndex.from_tuples. The cut works as intended however the categories are shown as the tuples I specified in the IntervalIndex. Is there any way to rename the categories into a different label e.g. (Small, Medium, Large)? Example: bins = pd.IntervalIndex.from_tuples([(0, 1), (2, 3), (4, 5)]) pd.cut([0, 0.5, 1.5, 2.5, 4.5], bins) The resulting categories will be: [NaN, (0, 1], NaN, (2, 3], (4, 5]] Categories (3, interval[int64]): [(0, 1] < (2, 3] < (4, 5]] I am trying to change [(0, 1] < (2, 3] < (4, 5]] into something like 1, 2 ,3 or small, medium ,large. Sadly, the labels parameter arguments of pd.cut is ignored when using IntervalIndex. Thanks! A: import pandas as pd query = [[1,2,3,4], [1,2], [0,2,4]] ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): query = [[1, [1,2,3,4]], [2, [1,2]], [3, [0,2,4]]] return pandas.DataFrame(query, columns=['id', 'scores']) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) 23. index: 3031 url: https://stackoverflow.com/questions/49625148/pandas-group-by-on-groupby-to-list-of-lists Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 0 0 1 1 0 1 1 0 1 0 1 0.5 Function 0 1 1 0 1 0 1 0 0 0 1 0.4 A2 A3 Origin: Problem: Given a dataframe structured like: rule_id | ordering | sequence_id 1 | 0 | 12 1 | 1 | 13 1 | 1 | 14 2 | 0 | 1 2 | 1 | 2 2 | 2 | 12 I need to transform it into: rule_id | sequences 1 | [[12],[13,14]] 2 | [[1],[2],[12]] that seems like easy groupby into groupby to list operation - I can not however make it work in pandas. df.groupby(['rule_id', 'ordering'])['sequence_id'].apply(list) leaves me with rule_id ordering 1 0 [12] 1 [13,14] 2 0 [1] 1 [2] 2 [12] How does one apply another groupBy operation to furtherly concat results into one list? A: import pandas as pd import io data = io.StringIO("""\ rule_id ordering sequence_id 1 0 12 1 1 13 1 1 14 2 0 1 2 1 2 2 2 12 """) df = pd.read_csv(data, delim_whitespace=True) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): return df.groupby(['rule_id', 'ordering'])['sequence_id'].apply(list).groupby(level=0).apply(list).reset_index(name='sequences') data = io.StringIO("""\ rule_id ordering sequence_id 1 0 12 1 1 13 1 1 14 2 0 1 2 1 2 2 2 12 """) df = pd.read_csv(data, delim_whitespace=True) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) Function: A: import pandas as pd def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return result Test: def g(df): return df.groupby(['rule_id', 'ordering'])['sequence_id'].apply(list).groupby(level=0).apply(list).reset_index(name='sequences') import io data = io.StringIO("""\ rule_id ordering sequence_id 1 0 12 1 1 13 1 1 14 2 0 1 2 1 2 2 2 12 """) df = pd.read_csv(data, delim_whitespace=True) print(f(df.copy())) print(pd.testing.assert_frame_equal(g(df.copy()), f(df.copy()), check_dtype=False)) 24. index: 3035 url: https://stackoverflow.com/questions/25837440/pandas-boolean-indexing-with-multi-index Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 0 1 1 1 1 1 1 1 1 1 1 0.9 Function 1 1 0 1 0 1 1 0 0 1 1 0.7 A2 A3 Origin: Problem: There are many questions here with similar titles, but I couldn't find one that's addressing this issue. I have dataframes from many different origins, and I want to filter one by the other. Using boolean indexing works great when the boolean series is the same size as the filtered dataframe, but not when the size of the series is the same as a higher level index of the filtered dataframe. In short, let's say I have this dataframe: In [4]: df = pd.DataFrame({'a':[1,1,1,2,2,2,3,3,3], 'b':[1,2,3,1,2,3,1,2,3], 'c':range(9)}).set_index(['a', 'b']) Out[4]: c a b 1 1 0 2 1 3 2 2 1 3 2 4 3 5 3 1 6 2 7 3 8 And this series: In [5]: filt = pd.Series({1:True, 2:False, 3:True}) Out[6]: 1 True 2 False 3 True dtype: bool And the output I want is this: c a b 1 1 0 2 1 3 2 3 1 6 2 7 3 8 I am not looking for solutions that are not using the filt series, such as: df[df.index.get_level_values('a') != 2] df[df.index.get_level_values('a').isin([1,3])] I want to know if I can use my input filt series as is, as I would use a filter on c: filt = df.c < 7 df[filt] A: import pandas as pd df = pd.DataFrame({'a': [1,1,1,2,2,2,3,3,3], 'b': [1,2,3,1,2,3,1,2,3], 'c': range(9)}).set_index(['a', 'b']) filt = pd.Series({1:True, 2:False, 3:True}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df, filt): return df[filt[df.index.get_level_values('a')].values] df = pd.DataFrame({'a': [1,1,1,2,2,2,3,3,3], 'b': [1,2,3,1,2,3,1,2,3], 'c': range(9)}).set_index(['a', 'b']) filt = pd.Series({1:True, 2:False, 3:True}) print(pd.testing.assert_frame_equal(g(df.copy(), filt.copy()), result, check_dtype=False)) Function: A: import pandas as pd def f(df, filt): ### BEGIN SOLUTION [insert] ### END SOLUTION return result Test: def g(df, filt): return df[filt[df.index.get_level_values('a')].values] df = pd.DataFrame({'a': [1,1,1,2,2,2,3,3,3], 'b': [1,2,3,1,2,3,1,2,3], 'c': range(9)}).set_index(['a', 'b']) filt = pd.Series({1:True, 2:False, 3:True}) print(f(df.copy(), filt.copy())) print(pd.testing.assert_frame_equal(g(df.copy(), filt.copy()), f(df.copy(), filt.copy()), check_dtype=False)) 25. index: 3039 url: https://stackoverflow.com/questions/48452933/python-comparison-ignoring-nan Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 0 0 0 0 0 0 0 0 0 0 0 0 Function 0 0 0 0 0 0 0 0 0 0 0 0 A2 0 0 0 0 0 0 0 0 0 0 0 0 A3 0 0 0 0 0 0 0 0 0 0 0 0 Origin: Problem: While nan == nan is always False, in many cases people want to treat them as equal, and this is enshrined in pandas.DataFrame.equals: NaNs in the same location are considered equal. Of course, I can write def equalp(x, y): return (x == y) or (math.isnan(x) and math.isnan(y)) However, this will fail on containers like [float("nan")] and isnan barfs on non-numbers (so the complexity increases). Imagine I have a DataFrame which may contain some Nan: c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 0 NaN 6.0 14.0 NaN 5.0 NaN 2.0 12.0 3.0 7.0 1 NaN 6.0 5.0 17.0 NaN NaN 13.0 NaN NaN NaN 2 NaN 17.0 NaN 8.0 6.0 NaN NaN 13.0 NaN NaN 3 3.0 NaN NaN 15.0 NaN 8.0 3.0 NaN 3.0 NaN 4 7.0 8.0 7.0 NaN 9.0 19.0 NaN 0.0 NaN 11.0 5 NaN NaN 14.0 2.0 NaN NaN 0.0 NaN NaN 8.0 6 3.0 13.0 NaN NaN NaN NaN NaN 12.0 3.0 NaN 7 13.0 14.0 NaN 5.0 13.0 NaN 18.0 6.0 NaN 5.0 8 3.0 9.0 14.0 19.0 11.0 NaN NaN NaN NaN 5.0 9 3.0 17.0 NaN NaN 0.0 NaN 11.0 NaN NaN 0.0 I just want to know which columns in row 0 and row 8 are different, desired: Index(['c0', 'c1', 'c3', 'c4', 'c6', 'c7', 'c8', 'c9'], dtype='object') A: import pandas as pd import numpy as np df = pd.DataFrame(np.random.randint(0, 20, (10, 10)).astype(float), columns=["c%d"%d for d in range(10)]) df.where(np.random.randint(0,2, df.shape).astype(bool), np.nan, inplace=True) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): return df.columns[df.iloc[0,:].fillna(0) != df.iloc[8,:].fillna(0)] print(pd.testing.assert_index_equal(g(df.copy()), result)) Function: A: import pandas as pd def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return result Test: def g(df): return df.columns[df.iloc[0,:].fillna(0) != df.iloc[8,:].fillna(0)] import numpy as np df = pd.DataFrame(np.random.randint(0, 20, (10, 10)).astype(float), columns=["c%d"%d for d in range(10)]) df.where(np.random.randint(0,2, df.shape).astype(bool), np.nan, inplace=True) print(f(df.copy())) print(pd.testing.assert_index_equal(g(df.copy()), f(df.copy()))) A3: Problem: While nan == nan is always False, in many cases people want to treat them as equal, and this is enshrined in pandas.DataFrame.equals: NaNs in the same location are considered equal. Of course, I can write def equalp(x, y): return (x == y) or (math.isnan(x) and math.isnan(y)) However, this will fail on containers like [float("nan")] and isnan barfs on non-numbers (so the complexity increases). Imagine I have a DataFrame which may contain some Nan: c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 0 NaN 6.0 14.0 NaN 5.0 NaN 2.0 12.0 3.0 7.0 1 NaN 6.0 5.0 17.0 NaN NaN 13.0 NaN NaN NaN 2 NaN 17.0 NaN 8.0 6.0 NaN NaN 13.0 NaN NaN 3 3.0 NaN NaN 15.0 NaN 8.0 3.0 NaN 3.0 NaN 4 7.0 8.0 7.0 NaN 9.0 19.0 NaN 0.0 NaN 11.0 5 NaN NaN 14.0 2.0 NaN NaN 0.0 NaN NaN 8.0 6 3.0 13.0 NaN NaN NaN NaN NaN 12.0 3.0 NaN 7 13.0 14.0 NaN 5.0 13.0 NaN 18.0 6.0 NaN 5.0 8 3.0 9.0 14.0 19.0 11.0 NaN NaN NaN NaN 5.0 9 3.0 17.0 NaN NaN 0.0 NaN 11.0 NaN NaN 0.0 I just want to know which columns in row 0 and row 8 are different, desired: Index(['c2', 'c5'], dtype='object') A: import pandas as pd import numpy as np df = pd.DataFrame(np.random.randint(0, 20, (10, 10)).astype(float), columns=["c%d"%d for d in range(10)]) df.where(np.random.randint(0,2, df.shape).astype(bool), np.nan, inplace=True) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): return df.columns[df.iloc[0,:].fillna(0) == df.iloc[8,:].fillna(0)] print(pd.testing.assert_index_equal(g(df.copy()), result)) 26. index: 3045 url: https://stackoverflow.com/questions/44764042/pandas-mix-position-and-label-indexing-without-chaining Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 0 0 0 0 0 0 0 0 0 0 0 0 Function 0 0 0 0 0 0 0 0 0 0 0 0 A2 0 0 0 0 0 0 0 0 0 0 0 0 A3 0 0 0 0 0 0 0 0 0 0 0 0 Origin: Problem: Since .ix has been deprecated as of Pandas 0.20, I wonder what is the proper way to mix lable-based, boolean-based and position-based indexing in Pandas? I need to assign values to a slice of dataframe that can be best referenced with label or boolean on the index and position on the columns. For example (using .loc as placeholder for the desired slicing method): df.loc[df['a'] == 'x', -12:-1] = 3 obviously this doesn't work, with which I get: TypeError: cannot do slice indexing on with these indexers [-12] of If I use .iloc, I get: NotImplementedError: iLocation based boolean indexing on an integer type is not available So how do I do it, without chaining, obviously to avoid chained assignment problem. 27. index: 3054 url: https://stackoverflow.com/questions/34258892/converting-year-and-day-of-year-into-datetime-index-in-pandas Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 0 0 0 0 0 0 0 1 1 0 1 0.2 Function 0 1 1 0 0 0 0 0 0 0 1 0.2 A2 A3 Origin: Problem: I have a dataframe: year doy 2000 49 2000 65 2000 81 2001 97 2001 113 2001 129 2001 145 2001 161 I want to create a datetime index for this dataframe. Here is what I am doing: df.index = pandas.DatetimeIndex(df['doy'].apply(lambda x: date(2000, 1, 1)+ relativedelta(days=int(x)-1))) However, this creates a datetime index which only uses 2000 as year. How can I fix that? A: import pandas as pd import io data = io.StringIO("""\ year doy 2000 49 2000 65 2000 81 2001 97 2001 113 2001 129 2001 145 2001 161 """) df = pd.read_csv(data, delim_whitespace=True) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): return df.columns[df.iloc[0,:].fillna(0) != df.iloc[8,:].fillna(0)] print(pd.testing.assert_index_equal(g(df.copy()), result)) Function: A: import pandas as pd def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return result Test: def g(df): return df.columns[df.iloc[0,:].fillna(0) != df.iloc[8,:].fillna(0)] import numpy as np df = pd.DataFrame(np.random.randint(0, 20, (10, 10)).astype(float), columns=["c%d"%d for d in range(10)]) df.where(np.random.randint(0,2, df.shape).astype(bool), np.nan, inplace=True) print(f(df.copy())) print(pd.testing.assert_index_equal(g(df.copy()), f(df.copy()))) 28. index: 3058 url: https://stackoverflow.com/questions/34258892/converting-year-and-day-of-year-into-datetime-index-in-pandas Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 0 1 0 1 1 1 0 1 1 0 1 0.6 Function 1 0 0 0 0 0 1 1 0 0 1 0.3 A2 A3 Origin: Problem: I have a data frame with many columns, say: df: name salary age title John 100 35 eng Bill 200 NaN adm Lena NaN 28 NaN Jane 120 45 eng I want to replace the null values in salary and age, but no in the other columns. I know I can do something like this: u = df[['salary', 'age']] df[['salary', 'age']] = u.fillna(-1) But this seems terse as it involves copying. Is there a more efficient way to do this? A: import pandas as pd import numpy as np df = pd.DataFrame({'name': ['John', 'Bill', 'Lena', 'Jane'], 'salary': [100, 200, np.NAN, 120], 'age': [35, np.NAN, 28, 45], 'title': ['eng', 'adm', np.NAN, 'eng']}) ### BEGIN SOLUTION [insert] ### END SOLUTION result = df print(result) Test: def g(df): df.loc[:, ['salary', 'age']] = df.loc[:, ['salary', 'age']].fillna(-1) return df df = pd.DataFrame({'name': ['John', 'Bill', 'Lena', 'Jane'], 'salary': [100, 200, np.NAN, 120], 'age': [35, np.NAN, 28, 45], 'title': ['eng', 'adm', np.NAN, 'eng']}) print(pd.testing.assert_frame_equal(g(df.copy()), result)) Function: A: import pandas as pd def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return result Test: def g(df): df.loc[:, ['salary', 'age']] = df.loc[:, ['salary', 'age']].fillna(-1) return df import numpy as np df = pd.DataFrame({'name': ['John', 'Bill', 'Lena', 'Jane'], 'salary': [100, 200, np.NAN, 120], 'age': [35, np.NAN, 28, 45], 'title': ['eng', 'adm', np.NAN, 'eng']}) print(f(df.copy())) print(pd.testing.assert_frame_equal(g(df.copy()), f(df.copy()))) 29. index: 3061 url: https://stackoverflow.com/questions/20303323/distance-calculation-between-rows-in-pandas-dataframe-using-a-distance-matrix Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 1 1 0 1 1 0 1 1 1 1 1 0.8 Function 0 1 1 1 0 0 0 0 1 1 1 0.5 A2 A3 Origin: Problem: I have the following Pandas DataFrame: In [31]: import pandas as pd sample = pd.DataFrame({'Sym1': ['a','a','a','d'],'Sym2':['a','c','b','b'],'Sym3':['a','c','b','d'],'Sym4':['b','b','b','a']},index=['Item1','Item2','Item3','Item4']) In [32]: print(sample) Out [32]: Sym1 Sym2 Sym3 Sym4 Item1 a a a b Item2 a c c b Item3 a b b b Item4 d b d a and I want to find the elegant way to get the distance between each Item according to this distance matrix: In [34]: DistMatrix = pd.DataFrame({'a': [0,0,0.67,1.34],'b':[0,0,0,0.67],'c':[0.67,0,0,0],'d':[1.34,0.67,0,0]},index=['a','b','c','d']) print(DistMatrix) Out[34]: a b c d a 0.00 0.00 0.67 1.34 b 0.00 0.00 0.00 0.67 c 0.67 0.00 0.00 0.00 d 1.34 0.67 0.00 0.00 For example comparing Item1 to Item2 would compare aaab -> accb -- using the distance matrix this would be 0+0.67+0.67+0=1.34 Ideal output: Item1 Item2 Item3 Item4 Item1 0 1.34 0 2.68 Item2 1.34 0 0 1.34 Item3 0 0 0 2.01 Item4 2.68 1.34 2.01 0 A: import pandas as pd sample = pd.DataFrame({'Sym1': ['a','a','a','d'],'Sym2':['a','c','b','b'],'Sym3':['a','c','b','d'],'Sym4':['b','b','b','a']},index=['Item1','Item2','Item3','Item4']) DistMatrix = pd.DataFrame({'a': [0,0,0.67,1.34],'b':[0,0,0,0.67],'c':[0.67,0,0,0],'d':[1.34,0.67,0,0]},index=['a','b','c','d']) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(sample, DistMatrix): return pd.DataFrame({idx1: {idx2: sum(DistMatrix[x][y] for (x, y) in zip(row1, row2)) for (idx2, row2) in sample.iterrows()} for (idx1, row1) in sample.iterrows()}) sample = pd.DataFrame({'Sym1': ['a','a','a','d'],'Sym2':['a','c','b','b'],'Sym3':['a','c','b','d'],'Sym4':['b','b','b','a']},index=['Item1','Item2','Item3','Item4']) DistMatrix = pd.DataFrame({'a': [0,0,0.67,1.34],'b':[0,0,0,0.67],'c':[0.67,0,0,0],'d':[1.34,0.67,0,0]},index=['a','b','c','d']) print(pd.testing.assert_frame_equal(g(sample.copy(), DistMatrix.copy()), result, check_dtype=False)) Function: A: import pandas as pd def f(sample, DistMatrix): ### BEGIN SOLUTION [insert] ### END SOLUTION return result Test: def g(sample, DistMatrix): return pd.DataFrame({idx1: {idx2: sum(DistMatrix[x][y] for (x, y) in zip(row1, row2)) for (idx2, row2) in sample.iterrows()} for (idx1, row1) in sample.iterrows()}) import numpy as np sample = pd.DataFrame({'Sym1': ['a','a','a','d'],'Sym2':['a','c','b','b'],'Sym3':['a','c','b','d'],'Sym4':['b','b','b','a']},index=['Item1','Item2','Item3','Item4']) DistMatrix = pd.DataFrame({'a': [0,0,0.67,1.34],'b':[0,0,0,0.67],'c':[0.67,0,0,0],'d':[1.34,0.67,0,0]},index=['a','b','c','d']) print(f(sample.copy(), DistMatrix.copy())) print(pd.testing.assert_frame_equal(g(sample.copy(), DistMatrix.copy()), f(sample.copy(), DistMatrix.copy()), check_dtype=False)) 30. index: 3062 url: https://stackoverflow.com/questions/37504672/pandas-dataframe-return-first-word-in-string-for-column Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin Function A2 A3 Origin: Problem: I have a dataframe: df = pd.DataFrame({'id' : ['abarth 1.4 a','abarth 1 a','land rover 1.3 r','land rover 2', 'land rover 5 g','mazda 4.55 bl'], 'series': ['a','a','r','','g', 'bl'] }) I would like to remove the 'series' string from the corresponding id, so the end result should be: Final result should be 'id': ['abarth 1.4','abarth 1','land rover 1.3','land rover 2','land rover 5', 'mazda 4.55'] Currently I am using df.apply: df.id = df.apply(lambda x: x['id'].replace(x['series'], ''), axis =1) But this removes all instances of the strings, even in other words, like so: 'id': ['brth 1.4','brth 1','land ove 1.3','land rover 2','land rover 5', 'mazda 4.55'] Should I somehow mix and match regex with the variable inside df.apply, like so? df.id = df.apply(lambda x: x['id'].replace(r'\b' + x['series'], ''), axis =1) A: import pandas as pd import numpy as np df = pd.DataFrame(np.random.randint(0, 20, (10, 10)).astype(float), columns=["c%d"%d for d in range(10)]) df.where(np.random.randint(0,2, df.shape).astype(bool), np.nan, inplace=True) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): return df.columns[df.iloc[0,:].fillna(0) != df.iloc[8,:].fillna(0)] print(pd.testing.assert_index_equal(g(df.copy()), result)) Function: A: import pandas as pd def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return result Test: def g(df): return df.columns[df.iloc[0,:].fillna(0) != df.iloc[8,:].fillna(0)] import numpy as np df = pd.DataFrame(np.random.randint(0, 20, (10, 10)).astype(float), columns=["c%d"%d for d in range(10)]) df.where(np.random.randint(0,2, df.shape).astype(bool), np.nan, inplace=True) print(f(df.copy())) print(pd.testing.assert_index_equal(g(df.copy()), f(df.copy()))) 31 index: 3063 url: https://stackoverflow.com/questions/26083293/calculating-autocorrelation-of-pandas-dataframe-along-each-column I want to calculate the autocorrelation coefficients of lag length one among columns of a Pandas DataFrame. A snippet of my data is: RF PC C D PN DN P year 1890 NaN NaN NaN NaN NaN NaN NaN 1891 -0.028470 -0.052632 0.042254 0.081818 -0.045541 0.047619 -0.016974 1892 -0.249084 0.000000 0.027027 0.067227 0.099404 0.045455 0.122337 1893 0.653659 0.000000 0.000000 0.039370 -0.135624 0.043478 -0.142062 Along year, I want to calculate autocorrelations of lag one for each column (RF, PC, etc...). To calculate the autocorrelations, I extracted two time series for each column whose start and end data differed by one year and then calculated correlation coefficients with numpy.corrcoef. For example, I wrote: numpy.corrcoef(data[['C']][1:-1],data[['C']][2:]) (the entire DataFrame is called data). However, the command unfortunately returned: array([[ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], ..., [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]]) Can somebody kindly advise me on how to calculate autocorrelations? 32. index: 3074 url: https://stackoverflow.com/questions/47139203/transpose-pandas-dataframe-and-change-the-column-headers-to-a-list Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin Function A2 A3 Origin: Problem: I have the following Pandas sub-dataframe col1 name1 name2 522 a 10 0.2 1021 b 72 -0.1 col1 has no duplicate. I want to transpose the dataframe and change the column header to col1 values. Ideally the output should look like Variable a b name1 10 72 name2 0.2 -0.1 it is easy to transpose the df and lable the first column as Variable df.transpose().reset_index().rename(columns={'index':'Variable'}) the resulted DF will have indices of original DF as column headers (and they are not sorted and dont start from 1 in my data!) How can I change the rest of column names? A: import pandas as pd df = pd.DataFrame({'col1':['a','b'], 'name1':[10,72], 'name2':[0.2,-0.1]}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): return df.set_index('col1').T.rename_axis('Variable').rename_axis(None,axis=1) print(pd.testing.assert_index_equal(g(df.copy()), result)) Function: A: import pandas as pd def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return result Test: def g(df): return df.set_index('col1').T.rename_axis('Variable').rename_axis(None,axis=1) df = pd.DataFrame({'col1':['a','b'], 'name1':[10,72], 'name2':[0.2,-0.1]}) print(f(df.copy())) print(pd.testing.assert_index_equal(g(df.copy()), f(df.copy()))) 33 I have the foll. dataframe: datetime 2012-01-01 125.5010 2012-01-02 125.5010 2012-01-03 125.5010 2012-02-04 125.5010 2012-02-05 125.5010 2012-02-29 125.5010 2012-02-28 125.5010 2016-01-07 125.5010 2016-01-08 125.5010 2016-02-29 81.6237 I would like to drop all rows corresponding to Feb 29th, resulting in foll. data frame: datetime 2012-01-01 125.5010 2012-01-02 125.5010 2012-01-03 125.5010 2012-02-04 125.5010 2012-02-05 125.5010 2012-02-28 125.5010 2016-01-07 125.5010 2016-01-08 125.5010 Right now, I am just doing it manually: df.drop(df.index[['2012-02-29']]). How can I make it so that it works for all years, without haveing to manually specify row index. 34. index: 3079 url: https://stackoverflow.com/questions/23573052/pandas-dataframe-how-do-i-remove-all-columns-and-rows-that-sum-to-0 Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 1 1 1 0 0 1 1 0 0 1 1 0.6 Function 0 1 0 1 1 1 0 1 0 1 1 0.6 A2 0 0 0 0 0 0 0 0 0 0 0 0 A3 0 0 0 0 0 0 0 0 0 0 0 0 Origin: Problem: I have a dataFrame with rows and columns that sum to 0. A B C D 0 1 1 0 1 1 0 0 0 0 2 1 0 0 1 3 0 1 0 0 4 1 1 0 1 The end result should be A B D 0 1 1 1 2 1 0 1 3 0 1 0 4 1 1 1 Notice the rows and columns that only had zeros have been removed. A: import pandas as pd df = pd.DataFrame([[1,1,0,1],[0,0,0,0],[1,0,0,1],[0,1,0,0],[1,1,0,1]],columns=['A','B','C','D']) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): return df.loc[(df.sum(axis=1) != 0), (df.sum(axis=0) != 0)] df = pd.DataFrame([[1,1,0,1],[0,0,0,0],[1,0,0,1],[0,1,0,0],[1,1,0,1]],columns=['A','B','C','D']) print(pd.testing.assert_frame_equal(g(df.copy()), result)) Function: A: import pandas as pd def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return result Test: def g(df): return df.loc[(df.sum(axis=1) != 0), (df.sum(axis=0) != 0)] df = pd.DataFrame([[1,1,0,1],[0,0,0,0],[1,0,0,1],[0,1,0,0],[1,1,0,1]],columns=['A','B','C','D']) print(f(df.copy())) print(pd.testing.assert_frame_equal(g(df.copy()), f(df.copy()))) A2: Problem: I have a dataFrame with rows and columns that sum to 0. A B C D 0 -1 -1 0 2 1 0 0 0 0 2 1 0 0 1 3 0 1 0 0 4 1 1 0 1 The end result should be A B D 2 1 0 1 3 0 1 0 4 1 1 1 Notice the rows and columns that only had zeros have been removed. A: import pandas as pd df = pd.DataFrame([[-1,-1,0,2],[0,0,0,0],[1,0,0,1],[0,1,0,0],[1,1,0,1]],columns=['A','B','C','D']) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): return df.loc[(df.sum(axis=1) != 0), (df.sum(axis=0) != 0)] df = pd.DataFrame([[-1,-1,0,2],[0,0,0,0],[1,0,0,1],[0,1,0,0],[1,1,0,1]],columns=['A','B','C','D']) print(pd.testing.assert_frame_equal(g(df.copy()), result)) A3: Problem: I have a dataFrame with rows and columns that max value is 2. A B C D 0 1 2 0 1 1 0 0 0 0 2 1 0 0 1 3 0 1 2 0 4 1 1 0 1 The end result should be A D 1 0 0 2 1 1 4 1 1 A: import pandas as pd df = pd.DataFrame([[1,2,0,1],[0,0,0,0],[1,0,0,1],[0,1,2,0],[1,1,0,1]],columns=['A','B','C','D']) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) Test: def g(df): return df.loc[(df.sum(axis=1) != 2), (df.sum(axis=0) != 2)] df = pd.DataFrame([[1,2,0,1],[0,0,0,0],[1,0,0,1],[0,1,2,0],[1,1,0,1]],columns=['A','B','C','D']) print(pd.testing.assert_frame_equal(g(df.copy()), result)) 35. index: 3087 url: https://stackoverflow.com/questions/35818873/pandas-series-creation-using-dataframe-columns-returns-nan-data-entries Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 1 1 1 1 1 1 1 1 1 1 1 1 Function 0 1 0 0 0 0 0 0 0 0 1 0.1 A2 A3 Origin: Problem: Im attempting to convert a dataframe into a series using code which, simplified, looks like this: dates = ['2016-1-{}'.format(i)for i in range(1,21)] values = [i for i in range(20)] data = {'Date': dates, 'Value': values} df = pd.DataFrame(data) df['Date'] = pd.to_datetime(df['Date']) ts = pd.Series(df['Value'], index=df['Date']) print(ts) However, print output looks like this: Date 2016-01-01 NaN 2016-01-02 NaN 2016-01-03 NaN 2016-01-04 NaN 2016-01-05 NaN 2016-01-06 NaN 2016-01-07 NaN 2016-01-08 NaN 2016-01-09 NaN 2016-01-10 NaN 2016-01-11 NaN 2016-01-12 NaN 2016-01-13 NaN 2016-01-14 NaN 2016-01-15 NaN 2016-01-16 NaN 2016-01-17 NaN 2016-01-18 NaN 2016-01-19 NaN 2016-01-20 NaN Name: Value, dtype: float64 Where does NaN come from? Is a view on a DataFrame object not a valid input for the Series class ? I have found the to_series function for pd.Index objects, is there something similar for DataFrames ? A: import pandas as pd dates = ['2016-1-{}'.format(i)for i in range(1,21)] values = [i for i in range(20)] data = {'Date': dates, 'Value': values} df = pd.DataFrame(data) df['Date'] = pd.to_datetime(df['Date']) ### BEGIN SOLUTION [insert] ### END SOLUTION result = ts print(result) Test: def g(df): return pd.Series(df['Value'].values, index=df['Date']) dates = ['2016-1-{}'.format(i)for i in range(1,21)] values = [i for i in range(20)] data = {'Date': dates, 'Value': values} df = pd.DataFrame(data) df['Date'] = pd.to_datetime(df['Date']) print(pd.testing.assert_series_equal(g(df.copy()), result, check_dtype=False)) Function: A: import pandas as pd def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return result Test: def g(df): return pd.Series(df['Value'].values, index=df['Date']) dates = ['2016-1-{}'.format(i)for i in range(1,21)] values = [i for i in range(20)] data = {'Date': dates, 'Value': values} df = pd.DataFrame(data) df['Date'] = pd.to_datetime(df['Date']) print(f(df.copy())) print(pd.testing.assert_series_equal(g(df.copy()), f(df.copy()), check_dtype=False)) 36* How do I find all rows in a pandas DataFrame which have the max value for count column, after grouping by ['Sp','Mt'] columns? Example 1: the following DataFrame, which I group by ['Sp','Mt']: Sp Mt Value count 0 MM1 S1 a **3** 1 MM1 S1 n 2 2 MM1 S3 cb **5** 3 MM2 S3 mk **8** 4 MM2 S4 bg **10** 5 MM2 S4 dgd 1 6 MM4 S2 rd 2 7 MM4 S2 cb 2 8 MM4 S2 uyi **7** Expected output: get the result rows whose count is max in each group, like: 0 MM1 S1 a **3** 2 MM1 S3 cb **5** 3 MM2 S3 mk **8** 4 MM2 S4 bg **10** 8 MM4 S2 uyi **7** Example 2: this DataFrame, which I group by ['Sp','Mt']: Sp Mt Value count 4 MM2 S4 bg 10 5 MM2 S4 dgd 1 6 MM4 S2 rd 2 7 MM4 S2 cb 8 8 MM4 S2 uyi 8 For the above example, I want to get all the rows where count equals max, in each group e.g: MM2 S4 bg 10 MM4 S2 cb 8 MM4 S2 uyi 8 *37* Suppose we take a pandas dataframe... name age family 0 john 1 1 1 jason 36 1 2 jane 32 1 3 jack 26 2 4 james 30 2 Then do a groupby() ... group_df = df.groupby('family') group_df = group_df.aggregate({'name': name_join, 'age': pd.np.mean}) Then do some aggregate/summarize operation (in my example, my function name_join aggregates the names): def name_join(list_names, concat='-'): return concat.join(list_names) The grouped summarized output is thus: age name family 1 23 john-jason-jane 2 28 jack-james Question: Is there a quick, efficient way to get to the following from the aggregated table? name age family 0 john 23 1 1 jason 23 1 2 jane 23 1 3 jack 28 2 4 james 28 2 (Note: the age column values are just examples, I don't care for the information I am losing after averaging in this specific example) The way I thought I could do it does not look too efficient: create empty dataframe from every line in group_df, separate the names return a dataframe with as many rows as there are names in the starting row append the output to the empty dataframe *38* I have a dataframe df, with two columns, I want to groupby one column and join the lists belongs to same group, example: column_a, column_b 1, [1,2,3] 1, [2,5] 2, [5,6] after the process: column_a, column_b 1, [1,2,3,2,5] 2, [5,6] I want to keep all the duplicates. I have the following questions: The dtypes of the dataframe are object(s). convert_objects() doesn't convert column_b to list automatically. How can I do this? what does the function in df.groupby(...).apply(lambda x: ...) apply to ? what is the form of x ? list? the solution to my main problem? Thanks in advance. *39* I have a pandas dataframe I would like to se the diagonal to 0 import numpy import pandas df = pandas.DataFrame(numpy.random.rand(5,5)) df Out[6]: 0 1 2 3 4 0 0.536596 0.674319 0.032815 0.908086 0.215334 1 0.735022 0.954506 0.889162 0.711610 0.415118 2 0.119985 0.979056 0.901891 0.687829 0.947549 3 0.186921 0.899178 0.296294 0.521104 0.638924 4 0.354053 0.060022 0.275224 0.635054 0.075738 5 rows × 5 columns now I want to set the diagonal to 0: for i in range(len(df.index)): for j in range(len(df.columns)): if i==j: df.loc[i,j] = 0 df Out[9]: 0 1 2 3 4 0 0.000000 0.674319 0.032815 0.908086 0.215334 1 0.735022 0.000000 0.889162 0.711610 0.415118 2 0.119985 0.979056 0.000000 0.687829 0.947549 3 0.186921 0.899178 0.296294 0.000000 0.638924 4 0.354053 0.060022 0.275224 0.635054 0.000000 5 rows × 5 columns but there must be a more pythonic way than that!? *40* Considering this Dataframe: Date State City SalesToday SalesMTD SalesYTD 20130320 stA ctA 20 400 1000 20130320 stA ctB 30 500 1100 20130320 stB ctC 10 500 900 20130320 stB ctD 40 200 1300 20130320 stC ctF 30 300 800 How can i group subtotals per state? State City SalesToday SalesMTD SalesYTD stA ALL 50 900 2100 stA ctA 20 400 1000 stA ctB 30 500 1100 I tried with a pivot table but i only can have subtotals in columns table = pivot_table(df, values=['SalesToday', 'SalesMTD','SalesYTD'],\ rows=['State','City'], aggfunc=np.sum, margins=True) I can achieve this on excel, with a pivot table. 41. score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 0 1 1 1 1 1 1 1 1 1 1 0.9 Function 1 1 1 0 1 1 0 1 0 0 1 0.6 A1 0 0 1 1 1 0 1 1 1 1 1 0.7 A2 1 1 1 1 1 1 1 1 1 1 1 1 A3 0 1 1 1 0 1 1 1 1 1 1 0.8 A4 A5 A6 A7 1 0 1 0 1 1 1 1 1 1 1 0.8 A8 html 1 1 1 1 1 1 1 1 1 1 1 1 html_A3 1 1 1 1 1 1 1 0 1 1 1 0.9 html_A7 1 1 0 1 0 1 1 1 1 1 1 0.8 Origin: Problem: I have df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) id stuff val 0 A 12 1 1 B 23232 2 2 A 13 -3 3 C 1234 1 4 D 3235 5 5 B 3236 6 6 C 732323 -2 I'd like to get a running sum of val for each id, so the desired output looks like this: id stuff val cumsum 0 A 12 1 1 1 B 23232 2 2 2 A 13 -3 -2 3 C 1234 1 1 4 D 3235 5 5 5 B 3236 6 8 6 C 732323 -2 -1 This is what I tried: df['cumsum'] = df.groupby('id').cumsum(['val']) and df['cumsum'] = df.groupby('id').cumsum(['val']) This is the error I get: ValueError: Wrong number of items passed 0, placement implies 1 code: import pandas as pd df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(df) ans=df test: def g(df): df['cumsum'] = df.groupby('id')['val'].transform(pd.Series.cumsum) return df df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) print(pd.testing.assert_frame_equal(g(df.copy()), ans, check_dtype=False)) Function: Problem: I have df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) id stuff val 0 A 12 1 1 B 23232 2 2 A 13 -3 3 C 1234 1 4 D 3235 5 5 B 3236 6 6 C 732323 -2 I'd like to get a running sum of val for each id, so the desired output looks like this: id stuff val cumsum 0 A 12 1 1 1 B 23232 2 2 2 A 13 -3 -2 3 C 1234 1 1 4 D 3235 5 5 5 B 3236 6 8 6 C 732323 -2 -1 This is what I tried: df['cumsum'] = df.groupby('id').cumsum(['val']) and df['cumsum'] = df.groupby('id').cumsum(['val']) This is the error I get: ValueError: Wrong number of items passed 0, placement implies 1 code: import pandas as pd def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return result test: def g(df): df['cumsum'] = df.groupby('id')['val'].transform(pd.Series.cumsum) return df ### test1 df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) print(f(df.copy())) print(pd.testing.assert_frame_equal(g(df.copy()), f(df.copy()), check_dtype=False)) ### test2 df = pd.DataFrame({'id': ['A', 'B']*10 +['C'] * 10,'val': np.random.randint(0 ,100 ,30)}) print(pd.testing.assert_frame_equal(g(df.copy()), f(df.copy()), check_dtype=False)) ### test6 random.choice df = pd.DataFrame({'id': np.random.choice(list('ABCDE'), 1000),'val': np.random.randint(-1000, 1000, 1000)}) print(pd.testing.assert_frame_equal(g(df.copy()), f(df.copy()), check_dtype=False)) A1: Problem: I have a dataframe containing 2 columns: id and val. I want to get a running sum of val for each id: For example: df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) id stuff val 0 A 12 1 1 B 23232 2 2 A 13 -3 3 C 1234 1 4 D 3235 5 5 B 3236 6 6 C 732323 -2 desired: id stuff val cumsum 0 A 12 1 1 1 B 23232 2 2 2 A 13 -3 -2 3 C 1234 1 1 4 D 3235 5 5 5 B 3236 6 8 6 C 732323 -2 -1 code: import pandas as pd df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(df) ans=df test: def g(df): df['cumsum'] = df.groupby('id')['val'].transform(pd.Series.cumsum) return df df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) print(pd.testing.assert_frame_equal(g(df.copy()), ans, check_dtype=False)) A2: Problem: I have df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'B'], 'val': [1,2,-3,6], 'stuff':['12','23232','13','1234','3235','3236','732323']}) id stuff val 0 A 12 1 1 B 23232 2 2 A 13 -3 3 B 3236 6 I'd like to get a running sum of val for each id, so the desired output looks like this: id stuff val cumsum 0 A 12 1 1 1 B 23232 2 2 2 A 13 -3 -2 3 B 3236 6 8 This is what I tried: df['cumsum'] = df.groupby('id').cumsum(['val']) and df['cumsum'] = df.groupby('id').cumsum(['val']) This is the error I get: ValueError: Wrong number of items passed 0, placement implies 1 code: import pandas as pd df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(df) ans=df test: def g(df): df['cumsum'] = df.groupby('id')['val'].transform(pd.Series.cumsum) return df df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) print(pd.testing.assert_frame_equal(g(df.copy()), ans, check_dtype=False)) A3: Problem: I have df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) id stuff val 0 A 12 1 1 B 23232 2 2 A 13 -3 3 C 1234 1 4 D 3235 5 5 B 3236 6 6 C 732323 -2 I'd like to get a running max of val for each id, so the desired output looks like this: id stuff val cummax 0 A 12 1 1 1 B 23232 2 2 2 A 13 -3 1 3 C 1234 1 1 4 D 3235 5 5 5 B 3236 6 6 6 C 732323 -2 1 This is what I tried: df['cummax'] = df.groupby('id').cummax(['val']) and df['cummax'] = df.groupby('id').cummax(['val']) This is the error I get: ValueError: Wrong number of items passed 0, placement implies 1 code: import pandas as pd df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(df) ans=df test: def g(df): df['cummax'] = df.groupby('id')['val'].transform(pd.Series.cummax) return df df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) print(pd.testing.assert_frame_equal(g(df.copy()), ans, check_dtype=False)) A7: Problem: I have df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) id stuff val 0 A 12 1 1 B 23232 2 2 A 13 -3 3 C 1234 1 4 D 3235 5 5 B 3236 6 6 C 732323 -2 I'd like to get a running sum of val for each id and if the sum is negative,set it to 0, so the desired output looks like this: id stuff val cumsum 0 A 12 1 1 1 B 23232 2 2 2 A 13 -3 0 3 C 1234 1 1 4 D 3235 5 5 5 B 3236 6 8 6 C 732323 -2 0 This is what I tried: df['cumsum'] = df.groupby('id').cumsum(['val']) and df['cumsum'] = df.groupby('id').cumsum(['val']) This is the error I get: ValueError: Wrong number of items passed 0, placement implies 1 code: import pandas as pd df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(df) ans=df test: def g(df): df['cumsum'] = df.groupby('id')['val'].transform(pd.Series.cumsum) df['cumsum'] = df['cumsum'].where(df['cumsum'] > 0, 0) return df html:

I have

df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']})

  id   stuff  val
0  A      12    1
1  B   23232    2
2  A      13   -3
3  C    1234    1
4  D    3235    5
5  B    3236    6
6  C  732323   -2

I'd like to get a running sum of val for each id, so the desired output looks like this:

  id   stuff  val  cumsum
0  A      12    1   1
1  B   23232    2   2
2  A      13   -3   -2
3  C    1234    1   1
4  D    3235    5   5
5  B    3236    6   8
6  C  732323   -2  -1

This is what I tried:

df['cumsum'] = df.groupby('id').cumsum(['val'])

and

df['cumsum'] = df.groupby('id').cumsum(['val'])

This is the error I get:

ValueError: Wrong number of items passed 0, placement implies 1
A: # import pandas as pd df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(df) ans=df # test: def g(df): df['cumsum'] = df.groupby('id')['val'].transform(pd.Series.cumsum) return df df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) print(pd.testing.assert_frame_equal(g(df.copy()), ans, check_dtype=False)) html_A3:

I have

df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']})

  id   stuff  val
0  A      12    1
1  B   23232    2
2  A      13   -3
3  C    1234    1
4  D    3235    5
5  B    3236    6
6  C  732323   -2

I'd like to get a running max of val for each id, so the desired output looks like this:

  id   stuff  val  cummax
0  A      12    1   1
1  B   23232    2   2
2  A      13   -3   -1
3  C    1234    1   1
4  D    3235    5   5
5  B    3236    6   6
6  C  732323   -2  -1

This is what I tried:

df['cummax'] = df.groupby('id').cummax(['val'])

and

df['cummax'] = df.groupby('id').cummax(['val'])

This is the error I get:

ValueError: Wrong number of items passed 0, placement implies 1
A: # import pandas as pd df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(df) ans=df # test: def g(df): df['cummax'] = df.groupby('id')['val'].transform(pd.Series.cummax) return df df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) print(pd.testing.assert_frame_equal(g(df.copy()), ans, check_dtype=False)) html_A7:

I have

df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']})

  id   stuff  val
0  A      12    1
1  B   23232    2
2  A      13   -3
3  C    1234    1
4  D    3235    5
5  B    3236    6
6  C  732323   -2

I'd like to get a running sum of val for each id and if the sum is negative,set it to 0, so the desired output looks like this:

  id   stuff  val  cumsum
0  A      12    1   1
1  B   23232    2   2
2  A      13   -3   0
3  C    1234    1   1
4  D    3235    5   5
5  B    3236    6   8
6  C  732323   -2  0

This is what I tried:

df['cumsum'] = df.groupby('id').cumsum(['val'])

and

df['cumsum'] = df.groupby('id').cumsum(['val'])

This is the error I get:

ValueError: Wrong number of items passed 0, placement implies 1
A: # import pandas as pd df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(df) ans=df # test: def g(df): df['cumsum'] = df.groupby('id')['val'].transform(pd.Series.cumsum) df['cumsum'] = df['cumsum'].where(df['cumsum'] > 0, 0) return df df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) print(pd.testing.assert_frame_equal(g(df.copy()), ans, check_dtype=False)) 42 I have a dataframe like this: RecID| A |B ---------------- 1 |a | abc 2 |b | cba 3 |c | bca 4 |d | bac 5 |e | abc And want to create another column, C, out of A and B such that for the same row, if the string in column A is contained in the string of column B, then C = True and if not then C = False. The example output I am looking for is this: RecID| A |B |C -------------------- 1 |a | abc |True 2 |b | cba |True 3 |c | bca |True 4 |d | bac |False 5 |e | abc |False Is there a way to do this in pandas quickly and without using a loop? Thanks *43* I am still new to Python pandas' pivot_table and would like to ask a way to count frequencies of values in one column, which is also linked to another column of ID. The DataFrame looks like the following. import pandas as pd df = pd.DataFrame({'Account_number':[1,1,2,2,2,3,3], 'Product':['A', 'A', 'A', 'B', 'B','A', 'B'] }) For the output, I'd like to get something like the following: Product A B Account_number 1 2 0 2 1 2 3 1 1 So far, I tried this code: df.pivot_table(rows = 'Account_number', cols= 'Product', aggfunc='count') This code gives me the two same things. What is the problems with the code above? A part of the reason why I am asking this question is that this DataFrame is just an example. The real data that I am working on has tens of thousands of account_numbers. *44* I have a dataframe like this d={} d['z']=['Q8','Q8','Q7','Q9','Q9'] d['t']=['10:30','10:31','10:38','10:40','10:41'] d['qty']=[20,20,9,12,12] I want compare first row with second row is qty same as next row AND is t greater in the next row AND is z value same as next row The desired value is qty t z valid 0 20 2015-06-05 10:30:00 Q8 False 1 20 2015-06-05 10:31:00 Q8 True 2 9 2015-06-05 10:38:00 Q7 False 3 12 2015-06-05 10:40:00 Q9 False 4 12 2015-06-05 10:41:00 Q9 True *45* Note:for simplicity's sake, i'm using a toy example, because copy/pasting dataframes is difficult in stack overflow (please let me know if there's an easy way to do this). Is there a way to merge the values from one dataframe onto another without getting the _X, _Y columns? I'd like the values on one column to replace all zero values of another column. df1: Name Nonprofit Business Education X 1 1 0 Y 0 1 0 <- Y and Z have zero values for Nonprofit and Educ Z 0 0 0 Y 0 1 0 df2: Name Nonprofit Education Y 1 1 <- this df has the correct values. Z 1 1 pd.merge(df1, df2, on='Name', how='outer') Name Nonprofit_X Business Education_X Nonprofit_Y Education_Y Y 1 1 1 1 1 Y 1 1 1 1 1 X 1 1 0 nan nan Z 1 1 1 1 1 In a previous post, I tried combine_First and dropna(), but these don't do the job. I want to replace zeros in df1 with the values in df2. Furthermore, I want all rows with the same Names to be changed according to df2. Name Nonprofit Business Education Y 1 1 1 Y 1 1 1 X 1 1 0 Z 1 0 1 (need to clarify: The value in 'Business' column where name = Z should 0.) My existing solution does the following: I subset based on the names that exist in df2, and then replace those values with the correct value. However, I'd like a less hacky way to do this. pubunis_df = df2 sdf = df1 regex = str_to_regex(', '.join(pubunis_df.ORGS)) pubunis = searchnamesre(sdf, 'ORGS', regex) sdf.ix[pubunis.index, ['Education', 'Public']] = 1 searchnamesre(sdf, 'ORGS', regex) *46* I have a dataframe with 3 columns in Python: Name1 Name2 Value Juan Ale 1 Ale Juan 1 and would like to eliminate the duplicates based on columns Name1 and Name2 combinations. In my example both rows are equal (but they are in different order), and I would like to delete the second row and just keep the first one, so the end result should be: Name1 Name2 Value Juan Ale 1 Any idea will be really appreciated! *47* Suppose I have a time series: In[138] rng = pd.date_range('1/10/2011', periods=10, freq='D') In[139] ts = pd.Series(randn(len(rng)), index=rng) In[140] Out[140]: 2011-01-10 0 2011-01-11 1 2011-01-12 2 2011-01-13 3 2011-01-14 4 2011-01-15 5 2011-01-16 6 2011-01-17 7 2011-01-18 8 2011-01-19 9 Freq: D, dtype: int64 If I use one of the rolling_* functions, for instance rolling_sum, I can get the behavior I want for backward looking rolling calculations: In [157]: pd.rolling_sum(ts, window=3, min_periods=0) Out[157]: 2011-01-10 0 2011-01-11 1 2011-01-12 3 2011-01-13 6 2011-01-14 9 2011-01-15 12 2011-01-16 15 2011-01-17 18 2011-01-18 21 2011-01-19 24 Freq: D, dtype: float64 But what if I want to do a forward-looking sum? I've tried something like this: In [161]: pd.rolling_sum(ts.shift(-2, freq='D'), window=3, min_periods=0) Out[161]: 2011-01-08 0 2011-01-09 1 2011-01-10 3 2011-01-11 6 2011-01-12 9 2011-01-13 12 2011-01-14 15 2011-01-15 18 2011-01-16 21 2011-01-17 24 Freq: D, dtype: float64 But that's not exactly the behavior I want. What I am looking for as an output is: 2011-01-10 3 2011-01-11 6 2011-01-12 9 2011-01-13 12 2011-01-14 15 2011-01-15 18 2011-01-16 21 2011-01-17 24 2011-01-18 17 2011-01-19 9 ie - I want the sum of the "current" day plus the next two days. My current solution is not sufficient because I care about what happens at the edges. I know I could solve this manually by setting up two additional columns that are shifted by 1 and 2 days respectively and then summing the three columns, but there's got to be a more elegant solution. *48* I have two dataframes as follows: leader: 0 11 1 8 2 5 3 9 4 8 5 6 [6065 rows x 2 columns] DatasetLabel: Unnamed: 0 0 1 .... 7 8 9 10 11 12 0 A J .... 1 2 5 NaN NaN NaN 1 B K .... 3 4 NaN NaN NaN NaN [4095 rows x 14 columns] The Information dataset column names 0 to 6 are DatasetLabel about data and 7 to 12 are indexes that refer to the first column of leader Dataframe. I want to create dataset where instead of the indexes in DatasetLabel Dataset I have the value of each index from the leader dataset, which is leader.iloc[index,1] How can I do it using python features? The output should look like: DatasetLabel: Unnamed: 0 0 1 .... 7 8 9 10 11 12 0 A J .... 8 5 6 NaN NaN NaN 1 B K .... 9 8 NaN NaN NaN NaN I have come up with the following, but I get an error: for column in DatasetLabel.ix[:,8:13]: DatasetLabel[DatasetLabel[column].notnull ()]=leader.iloc[DatasetLabel[DatasetLabel[column].notnull ()][column].values,1] Error: ValueError: Must have equal len keys and value when setting with an iterable *49* I have a dataframe like this df = pd.DataFrame({'a' : [1,1,0,0], 'b': [0,1,1,0], 'c': [0,0,1,1]}) I want to get a b c a 2 1 0 b 1 2 1 c 0 1 2 where a,b,c are column names, and I get the values counting '1' in all columns when the filter is '1' in another column. For ample, when df.a == 1, we count a = 2, b =1, c = 0 etc I made a loop to solve matrix = [] for name, values in df.iteritems(): matrix.append(pd.DataFrame( df.groupby(name, as_index=False).apply(lambda x: x[x == 1].count())).values.tolist()[1]) pd.DataFrame(matrix) But I think that there is a simpler solution, isn't it? *50* I have a data frame like this ID col1 col2 1 Abc street 2017-07-27 1 None 2017-08-17 1 Def street 2018-07-15 1 None 2018-08-13 2 fbg street 2018-01-07 2 None 2018-08-12 2 trf street 2019-01-15 I want to filter all the 'None' from col1 and add the corresponding col2 value into a new column col3. My output look like this ID col1 col2 col3 1 Abc street 2017-07-27 2017-08-17 1 Def street 2018-07-15 2018-08-13 2 fbg street 2018-01-07 2018-08-12 2 trf street 2019-01-15 Can anyone help me to achieve this. 51. index:5000 score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 0 0 0 0 0 0 0 0 1 0 1 0.1 Function 1 0 0 0 0 0 0 0 0 0 1 0.1 A1 A2 A3 A4 0 0 0 0 1 0 0 0 0 0 1 0.1 A5 A6 A7 A8 html 0 0 0 0 1 0 0 0 0 0 1 0.1 html_A4 1 0 0 0 0 0 0 0 0 0 1 0.1 2-shot 0 0 0 0 0 0 0 0 0 0 0 0 2-shot_A4 0 0 0 1 0 0 0 0 0 0 1 0.1 Origin: Problem: I've seen similar questions but mine is more direct and abstract. I have a dataframe with "n" rows, being "n" a small number.We can assume the index is just the row number. I would like to convert it to just one row. So for example if I have A,B,C,D,E --------- 1,2,3,4,5 6,7,8,9,10 11,12,13,14,5 I want as a result a dataframe with a single row: A_1,B_1,C_1,D_1,E_1,A_2,B_2_,C_2,D_2,E_2,A_3,B_3,C_3,D_3,E_3 -------------------------- 1,2,3,4,5,6,7,8,9,10,11,12,13,14,5 What would be the most idiomatic way to do this in Pandas? code: import pandas as pd df = pd.DataFrame([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]],columns=['A','B','C','D','E']) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) test: def g(df): df.index += 1 df_out = df.stack() df.index -= 1 df_out.index = df_out.index.map('{0[1]}_{0[0]}'.format) return df_out.to_frame().T df = pd.DataFrame([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]],columns=['A','B','C','D','E']) print(pd.testing.assert_frame_equal(result, g(df.copy()))) A4: Problem: I've seen similar questions but mine is more direct and abstract. I have a dataframe with "n" rows, being "n" a small number.We can assume the index is just the row number. I would like to convert it to just one row. So for example if I have A,B,C,D,E --------- 1,2,3,4,5 6,7,8,9,10 11,12,13,14,5 I want as a result a dataframe with a single row: A_0,B_0,C_0,D_0,E_0,A_1,B_1_,C_1,D_1,E_1,A_2,B_2,C_2,D_2,E_2 -------------------------- 1,2,3,4,5,6,7,8,9,10,11,12,13,14,5 What would be the most idiomatic way to do this in Pandas? code: import pandas as pd import numpy as np df = pd.DataFrame([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]],columns=['A','B','C','D','E']) ### BEGIN SOLUTION [insert] ### END SOLUTION print(ans) test: def g(df): df_out = df.stack() df_out.index = df_out.index.map('{0[1]}_{0[0]}'.format) return df_out.to_frame().T df = pd.DataFrame([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]],columns=['A','B','C','D','E']) print(pd.testing.assert_frame_equal(ans, g(df.copy()))) html:

I've seen similar questions but mine is more direct and abstract.

I have a dataframe with "n" rows, being "n" a small number.We can assume the index is just the row number. I would like to convert it to just one row.

So for example if I have

A,B,C,D,E
---------
1,2,3,4,5
6,7,8,9,10
11,12,13,14,5

I want as a result a dataframe with a single row:

A_1,B_1,C_1,D_1,E_1,A_2,B_2_,C_2,D_2,E_2,A_3,B_3,C_3,D_3,E_3
--------------------------
1,2,3,4,5,6,7,8,9,10,11,12,13,14,5

What would be the most idiomatic way to do this in Pandas?

A: # import pandas as pd df = pd.DataFrame([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]],columns=['A','B','C','D','E']) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) # test: def g(df): df.index += 1 df_out = df.stack() df.index -= 1 df_out.index = df_out.index.map('{0[1]}_{0[0]}'.format) return df_out.to_frame().T df = pd.DataFrame([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]],columns=['A','B','C','D','E']) print(pd.testing.assert_frame_equal(result, g(df.copy()))) 52. I have dataframe that has values like those: A B ["I need avocado" "something"] ["something" "I eat margarina"] And I want to find rows that: In any column of the row, the column's value is contained in a list. for example, for the list: ["apple","avocado","bannana"] And only this line should match: ["I need avocado" "something"] This line doesnt work: dataFiltered[dataFiltered[col].str.contains(*includeKeywords)] Returns: {TypeError}unsupported operand type(s) for &: 'str' and 'int' What should I do? *53* I have already loaded my data into Pandas dataframe. Example: Date Price 2012/12/02 141.25 2012/12/05 132.64 2012/12/06 132.11 2012/12/21 141.64 2012/12/25 143.19 2012/12/31 139.66 2013/01/05 145.11 2013/01/06 145.99 2013/01/07 145.97 2013/01/11 145.11 2013/01/12 145.99 2013/01/24 145.97 2013/02/23 145.11 2013/03/24 145.99 2013/03/28 145.97 2013/04/28 145.97 2013/05/24 145.97 2013/06/23 145.11 2013/07/24 145.99 2013/08/28 145.97 2013/09/28 145.97 Just two columns, one is data and one is price. Now how to group or resample the data starts from 2013 to monthly and quarterly df? Monthly: Date Price 2013/01/01 Monthly total 2013/02/01 Monthly total 2013/03/01 Monthly total 2013/04/01 Monthly total 2013/05/01 Monthly total 2013/06/01 Monthly total 2013/07/01 Monthly total 2013/08/01 Monthly total 2013/09/01 Monthly total Quarterly: Date Price 2013/01/01 Quarterly total 2013/04/01 Quarterly total 2013/07/01 Quarterly total Please note that the monthly and quarterly data need to start from first day of month but in the original dataframe the first day of month data is missing, quantity of valid daily data in each month could vary. Also the original dataframe has data from 2012 to 2013, I only need monthly and quarterly data from beginning of 2013. I tried something like result1 = df.groupby([lambda x: x.year, lambda x: x.month], axis=1).sum() but does not work. Thank you! *54* I have a large data frame composed of 450 columns with 550 000 rows. In the columns i have : 73 float columns 30 columns dates remainder columns in object I would like to make a description of my variables, but not only describe as usual, but also include other descriptions in the same matrix. At the final, we will have a matrix of description with the set of 450 variables then a detailed description of: - dtype - count - count null values - % number of null values - max - min - 50% - 75% - 25% - ...... For now, i have juste a basic function that describe my data like this : Dataframe.describe(include = 'all') Do you have a function or method to do this more extensive descrition. Thanks. *55* I've read this, this and this posts but despite I don't know why quotechar does not work at pd.read_csv() (Python 3, pandas 0.18.0 and 0.18.1). And how could I read a dataframe like this: "column1","column2", "column3", "column4", "column5", "column6" "AM", 7, "1", "SD", "SD", "CR" "AM", 8, "1,2 ,3", "PR, SD,SD", "PR ; , SD,SD", "PR , ,, SD ,SD" "AM", 1, "2", "SD", "SD", "SD" I want the following result: Out[116]: column1 column2 column3 column4 column5 column6 0 AM 7 1 SD SD CR 1 AM 8 1,2 ,3 PR, SD,SD PR ; , SD,SD PR , ,, SD,SD 2 AM 1 2 SD SD SD Thank you!! *56* I am working with a large pandas dataframe, with several columns pretty much like this: A B C D John Tom 0 1 Homer Bart 2 3 Tom Maggie 1 4 Lisa John 5 0 Homer Bart 2 3 Lisa John 5 0 Homer Bart 2 3 Homer Bart 2 3 Tom Maggie 1 4 How can I assign an unique id to each repeated row? For example: A B C D new_id John Tom 0 1.2 1 Homer Bart 2 3.0 2 Tom Maggie 1 4.2 3 Lisa John 5 0 4 Homer Bart 2 3 5 Lisa John 5 0 4 Homer Bart 2 3.0 2 Homer Bart 2 3.0 2 Tom Maggie 1 4.1 6 I know that I can use duplicate to detect the duplicated rows, however I can not visualize were are reapeting those rows. I tried to: df.assign(id=(df.columns).astype('category').cat.codes) df However, is not working. How can I get a unique id for detecting groups of duplicated rows? *57* I am looking to group by two columns: user_id and date; however, if the dates are close enough, I want to be able to consider the two entries part of the same group and group accordingly. Date is m-d-y user_id date val 1 1-1-17 1 2 1-1-17 1 3 1-1-17 1 1 1-1-17 1 1 1-2-17 1 2 1-2-17 1 2 1-10-17 1 3 2-1-17 1 The grouping would group by user_id and dates +/- 3 days from each other. so the group by summing val would look like: user_id date sum(val) 1 1-2-17 3 2 1-2-17 2 2 1-10-17 1 3 1-1-17 1 3 2-1-17 1 Any way someone could think of that this could be done (somewhat) easily? I know there are some problematic aspects of this. for example, what to do if the dates string together endlessly with three days apart. but the exact data im using only has 2 values per person.. Thanks! *58* I have a large dataframe from which I get the data I need with groupby. I need to get several separate columns from the index of new dataframe. Part of the original dataframe looks like this: code place vl year week 0 111.0002.0056 region1 1 2017 29 1 112.6500.2285 region2 1 2017 31 2 112.5600.6325 region2 1 2017 30 3 112.5600.6325 region2 1 2017 30 4 112.5600.8159 region2 1 2017 30 5 111.0002.0056 region2 1 2017 29 6 111.0002.0056 region2 1 2017 30 7 111.0002.0056 region2 1 2017 28 8 112.5600.8159 region3 1 2017 31 9 112.5600.8159 region3 1 2017 28 10 111.0002.0114 region3 1 2017 31 .... After applying groupby, it looks like this (code: df_test1 = df_test.groupby(['code' , 'year', 'week', 'place'])['vl'].sum().unstack(fill_value=0)): place region1 region2 region3 region4 index1 code year week 111.0002.0006 2017 29 0 3 0 0 (111.0002.0006, 2017, 29) 30 0 7 0 0 (111.0002.0006, 2017, 30) 111.0002.0018 2017 29 0 0 0 0 (111.0002.0018, 2017, 29) 111.0002.0029 2017 30 0 0 0 0 (111.0002.0029, 2017, 30) 111.0002.0055 2017 28 0 33 0 8 (111.0002.0055, 2017, 28) 29 1 155 2 41 (111.0002.0055, 2017, 29) 30 0 142 1 39 (111.0002.0055, 2017, 30) 31 0 31 0 13 (111.0002.0055, 2017, 31) 111.0002.0056 2017 28 9 36 0 4 (111.0002.0056, 2017, 28) 29 20 75 2 37 (111.0002.0056, 2017, 29) 30 17 81 2 33 (111.0002.0056, 2017, 30) .... I save the index in a separate column index1 (code: df_test1['index1'] = df_test1.index) I need to get out of the column index1 three separate columns code, year and week. The result should look like this: region1 region2 region3 region4 code year week 0 3 0 0 111.0002.0006 2017 29 0 7 0 0 111.0002.0006 2017 30 0 0 0 0 111.0002.0018 2017 29 0 0 0 0 111.0002.0029 2017 30 0 33 0 8 111.0002.0055 2017 28 1 155 2 41 111.0002.0055 2017 29 0 142 1 39 111.0002.0055 2017 30 0 31 0 13 111.0002.0055 2017 31 .... I would be grateful for any advice! *59* I have a large dataframe from which I get the data I need with groupby. I need to get several separate columns from the index of new dataframe. Part of the original dataframe looks like this: code place vl year week 0 111.0002.0056 region1 1 2017 29 1 112.6500.2285 region2 1 2017 31 2 112.5600.6325 region2 1 2017 30 3 112.5600.6325 region2 1 2017 30 4 112.5600.8159 region2 1 2017 30 5 111.0002.0056 region2 1 2017 29 6 111.0002.0056 region2 1 2017 30 7 111.0002.0056 region2 1 2017 28 8 112.5600.8159 region3 1 2017 31 9 112.5600.8159 region3 1 2017 28 10 111.0002.0114 region3 1 2017 31 .... After applying groupby, it looks like this (code: df_test1 = df_test.groupby(['code' , 'year', 'week', 'place'])['vl'].sum().unstack(fill_value=0)): place region1 region2 region3 region4 index1 code year week 111.0002.0006 2017 29 0 3 0 0 (111.0002.0006, 2017, 29) 30 0 7 0 0 (111.0002.0006, 2017, 30) 111.0002.0018 2017 29 0 0 0 0 (111.0002.0018, 2017, 29) 111.0002.0029 2017 30 0 0 0 0 (111.0002.0029, 2017, 30) 111.0002.0055 2017 28 0 33 0 8 (111.0002.0055, 2017, 28) 29 1 155 2 41 (111.0002.0055, 2017, 29) 30 0 142 1 39 (111.0002.0055, 2017, 30) 31 0 31 0 13 (111.0002.0055, 2017, 31) 111.0002.0056 2017 28 9 36 0 4 (111.0002.0056, 2017, 28) 29 20 75 2 37 (111.0002.0056, 2017, 29) 30 17 81 2 33 (111.0002.0056, 2017, 30) .... I save the index in a separate column index1 (code: df_test1['index1'] = df_test1.index) I need to get out of the column index1 three separate columns code, year and week. The result should look like this: region1 region2 region3 region4 code year week 0 3 0 0 111.0002.0006 2017 29 0 7 0 0 111.0002.0006 2017 30 0 0 0 0 111.0002.0018 2017 29 0 0 0 0 111.0002.0029 2017 30 0 33 0 8 111.0002.0055 2017 28 1 155 2 41 111.0002.0055 2017 29 0 142 1 39 111.0002.0055 2017 30 0 31 0 13 111.0002.0055 2017 31 .... I would be grateful for any advice! *60* I have a DataFrame stats with a Multindex and 8 samples (only two shown here) and 8 genes for each sample. In[13]:stats Out[13]: ARG/16S \ count mean std min sample gene Arnhem IC 11.0 2.319050e-03 7.396130e-04 1.503150e-03 Int1 11.0 7.243040e+00 6.848327e+00 1.364879e+00 Sul1 11.0 3.968956e-03 9.186019e-04 2.499074e-03 TetB 2.0 1.154748e-01 1.627663e-01 3.816936e-04 TetM 4.0 1.083125e-04 5.185259e-05 5.189226e-05 blaOXA 4.0 4.210963e-06 3.783235e-07 3.843571e-06 ermB 4.0 4.111081e-05 7.894879e-06 3.288865e-05 ermF 4.0 2.335210e-05 4.519758e-06 1.832037e-05 Basel Aph3a 4.0 7.815592e-06 1.757242e-06 5.539389e-06 IC 11.0 5.095161e-03 5.639278e-03 1.302205e-03 Int1 12.0 1.333068e+01 1.872207e+01 4.988048e-02 Sul1 11.0 1.618617e-02 1.988817e-02 2.970397e-03 I'm trying to calculate the p-value (Students t-test) for each of these samples, comparing each of the genes between them. I've used scipy.stats.ttest_ind_from_stats but I managed to get the p-values for the different samples for one gene and only those of the samples neighboring each other. Experiments = list(values1_16S['sample'].unique()) for exp in Experiments: if Experiments.index(exp)>> df vals 2017-04-01 9 2017-04-02 8 2017-04-03 4 2017-04-04 5 2017-04-05 9 2017-04-06 9 2017-04-07 5 2017-04-08 3 2017-04-09 3 2017-04-10 1 and a particular date which I know is in my index but do not know the position of, for example cur_dt = df.index[np.random.randint(0, df.index.size)] >>> cur_dt Timestamp('2017-04-05 00:00:00', freq='D') Given cur_dt, I want to determine what the previous and next values in my index are. Should cur_dt be the first (last) value in my index, then the previous (next) element should be cur_dt itself. To recap, my question is, what is the easiest way to find the previous and next value in my index (or my current value itself if it is an endpoint) given my current value? My current approach seems rather roundabout, which is my motivation for asking. cur_iloc = df.index.get_loc(cur_dt) prev = cur_dt if cur_iloc == 0 else df.index[cur_iloc-1] next = cur_dt if cur_iloc == df.index.size-1 else df.index[cur_iloc+1] >>> prev Timestamp('2017-04-04 00:00:00', freq='D') >>> next Timestamp('2017-04-06 00:00:00', freq='D') If there's no more straightforward way after all then my apologies. I'm imagining being able to just "shift" my index from my current value once forwards and once backwards (with some nice treatment for endpoints), but am not sure if this is possible. *69* As per the following data set I want no get the number of unique values and count of the unique values. My data set: Account_Type Gold Gold Platinum Gold Output : no of unique values : 2 unique values : [Gold,Platinum] Gold : 3 Platinum :1 *70* I have a data frame with 3 columns: time (which is in the format 'YYYY-MM-DDTHH:MM:SSZ'), device_id, and rain, but I need the first column, time, to become three columns of day, month, and year with values from the timestamp. So the original data frame looks something like this: time device_id rain 2016-12-27T00:00:00Z 9b839362-b06d-4217-96f5-f261c1ada8d6 NaN 2016-12-28T00:00:00Z 9b839362-b06d-4217-96f5-f261c1ada8d6 0.2 2016-12-29T00:00:00Z 9b839362-b06d-4217-96f5-f261c1ada8d6 NaN 2016-12-30T00:00:00Z 9b839362-b06d-4217-96f5-f261c1ada8d6 NaN 2016-12-31T00:00:00Z 9b839362-b06d-4217-96f5-f261c1ada8d6 NaN But I'm trying to get the data frame to look like this: day month year device_id rain 27 12 2016 9b839362-b06d-4217-96f5-f261c1ada8d6 NaN 28 12 2016 9b839362-b06d-4217-96f5-f261c1ada8d6 0.2 29 12 2016 9b839362-b06d-4217-96f5-f261c1ada8d6 NaN 30 12 2016 9b839362-b06d-4217-96f5-f261c1ada8d6 NaN 31 12 2016 9b839362-b06d-4217-96f5-f261c1ada8d6 NaN I don't care about the hour/seconds/minutes but need these values from the original time stamp, and I don't even know where to start. Please help! Here's some reproducible code to get started: >> import pandas as pd >> df = pd.DataFrame([['2016-12-27T00:00:00Z', '9b839362-b06d-4217-96f5-f261c1ada8d6', 'NaN']], columns=['time', 'device_id', 'rain']) >> print df 2016-12-27T00:00:00Z 9b849362-b06d-4217-96f5-f261c1ada8d6 NaN *71* I am trying cut videos based on some caracteristics. My current strategy leads on a pandas series of booleans for each frame, indexed by timestamp. True to keep it, False to dump it. As I plan to cut videos, i need to extract boundaries from this list, so that i can tell fmpeg beginning and end of the parts I want to extract from the main video. Tu sum up : I have a pandas Series which looks like this: acquisitionTs 0.577331 False 0.611298 False 0.645255 False 0.679218 False 0.716538 False 0.784453 True 0.784453 True 0.818417 True 0.852379 True 0.886336 True 0.920301 True 0.954259 False ... 83.393376 False 83.427345 False dtype: bool (truncated for presenting reasons, but the TimeStamp usually begins at 0) and I need to get boundaries of True sequences, so in this example i should get [[t_0,t_1],[t_2,t_3]n, ... [t_2n-1,t_2n]] , with t_0 = 0.784453 and t_1 = 0.920301 if I have n different sequences of True in my pandas Series. Now that probleme seems very simple, in fact you can just shift the sequence by one and a make a xor between the to get a list of boolean with True being for boundaries e = df.shift(periods=1, freq=None, axis=0)^df print(e[e].index) (with df being a pandas Series) there is still some work to do, like figuring if first element is a rising edge or a falling edge, but this hack works. However that doesn't seem very pythonic. In fact, the probleme is so simple I believe that there must be somewhere in pandas, numpy or even python a prebuilt function for this which would fit nicely in a single function call instead of a hack like above. The groupby function seems promising though, but i never used it before. How would be the best way of doing this ? *72* Given such a data frame, including the item and corresponding review texts: item_id review_text B2JLCNJF16 i was attracted to this... B0009VEM4U great snippers... I want to map the top 5000 most frequent word in review_text, so the resulting data frame should be like: item_id review_text B2JLCNJF16 1 2 3 4 5... B0009VEM4U 6... #as the word "snippers" is out of the top 5000 most frequent word Or, a bag-of-word vector is highly preferred: item_id review_text B2JLCNJF16 [1,1,1,1,1....] B0009VEM4U [0,0,0,0,0,1....] How can I do that? Thanks a lot! EDIT: I have tried @ayhan 's answer. Now I have successfully changed the review text to a doc2bow form: item_id review_text B2JLCNJF16 [(123,2),(130,3),(159,1)...] B0009VEM4U [(3,2),(110,2),(121,5)...] It denotes the word of ID 123 has occurred 2 times in that document. Now I'd like to transfer it to a vector like: [0,0,0,.....,2,0,0,0,....,3,0,0,0,......1...] #123rd 130th 159th Do you how to do that? Thank you in advance! *73* I have a dataframe with 2 columns, count percent grpno. 0 14.78 1 1 0.00 2 2 8.80 3 3 9.60 4 4 55.90 4 5 0.00 2 6 0.00 6 7 0.00 5 8 6.90 1 9 59.00 4 I need to get the max of column 'count percent ' and group by column 'grpno.'. Though I tried doing the same by geostat.groupby(['grpno.'], sort=False)['count percent'].max() I get the output to be grpno. 1 14.78 2 0.00 3 8.80 4 59.00 6 0.00 5 0.00 Name: count percent, dtype: float64 But I need output to be a dataframe that has the column name modified as 'MaxOfcount percent' and 'grpno.' Can anyone help on this? Thanks *74* Hi is there a way to get a substring of a column based on another column? import pandas as pd x = pd.DataFrame({'name':['bernard','brenden','bern'],'digit':[2,3,3]}) x digit name 0 2 bernard 1 3 brenden 2 3 bern What i would expect is something like: for row in x.itertuples(): print row[2][:row[1]] be bre ber where the result is the substring of name based on digit. I know if I really want to I can create a list based on the itertuples function but does not seem right and also, I always try to create a vectorized method. Appreciate any feedback. *75* I have created a column with country name, and lattitude and longitude values in a single column. now i want the latitude value and longitude values in a different column. code used to create the column. df['Country_cord'] = df['Country'].apply(geolocator.geocode) Thats how the output looks like. 0 (España, (40.0028028, -4.003104)) 1 (United Kingdom, دبي‎, الإمارات العربيّة المتّ... 2 (France métropolitaine, France, (46.603354, 1.... 3 (United States of America, (39.7837304, -100.4... 4 (Italia, (42.6384261, 12.674297)) 5 (Deutschland, Europe, (51.0834196, 10.4234469)) 6 (Argentina, (-34.9964963, -64.9672817)) 7 (Ireland, (52.865196, -7.9794599)) 8 (België / Belgique / Belgien, (50.6407351, 4.6... 9 (מדינת ישראל, (30.8760272, 35.0015196)) 10 (Schweiz/Suisse/Svizzera/Svizra, (46.7985624, ... 11 (Nederland, (52.2379891, 5.53460738161551)) 12 (Brasil, (-10.3333333, -53.2)) 13 (Portugal, (40.033265, -7.8896263)) 14 (Australia, (-24.7761086, 134.755)) 15 (Danmark, (55.670249, 10.3333283)) 16 (Maroc ⵍⵎⵖⵔⵉⴱ المغرب, (31.1728192, -7.3366043)) 17 (Ciudad de México, Cuauhtémoc, CDMX, 06060, Mé... 18 (Canada, (61.0666922, -107.9917071)) 19 (Sverige, (59.6749712, 14.5208584)) i want output to be in a form where i have a column for latitude and one column for longitude. df[lat] df[lon] 40.0028028 46.603354 46.603354 1.8883335 *76* I have a dictionary with City names as keys and corresponding to each city there is a list of dates. For Example: { 'A':['2017-01-02','2017-01-03'], 'B':['2017-02-02','2017-02-03','2017-02-04','2017-02-05'], 'C':['2016-02-02'] } And I want to convert this to the following dataframe with 2 columns. City_Name Date A 2017-01-02 A 2017-01-03 B 2017-02-02 B 2017-02-03 B 2017-02-04 B 2017-02-05 C 2016-02-02 *77* Good morning chaps, Any pythonic way to explode a dataframe column into multiple columns with boolean flags, based on some condition (str.contains in this case)? Let's say I have this: Position Letter 1 a 2 b 3 c 4 b 5 b And I'd like to achieve this: Position Letter is_a is_b is_C 1 a TRUE FALSE FALSE 2 b FALSE TRUE FALSE 3 c FALSE FALSE TRUE 4 b FALSE TRUE FALSE 5 b FALSE TRUE FALSE Can do with a loop through 'abc' and explicitly creating new df columns, but wondering if some built-in method already exists in pandas. Number of possible values, and hence number of new columns is variable. Thanks and regards. *78* Could you please help me with joining two DataFrames. I have two DataFrames. df1: index val1 val2 -------------------- 1 str1 abc1 2 str2 abc2 3 str3 abc3 4 str4 abc9 5 str5 abc4 df2: index val2 ------------ 1 abc1 2 abc2 4 abc3 5 abc4 9 abc5 I need to create a DataFrame based on the previous two with a left join by two columns. Columns index and val2 have the same names in both DataFrames. The result of df3 should look like this: index val1 val2 val3 ---------------------------- 1 str1 abc1 1 2 str2 abc2 1 3 str3 abc3 NaN 4 str4 abc9 NaN 5 str5 abc4 1 Indexes from df2 that are not present in df1 should be dropped, if an index in df1 has the same val2 as in df2 then 1 should be added to a new column val3, else: NaN. Huge thanks in advance! *79* I have two dataframes : df1 and df2 df1: TIMESTAMP eq1 eq2 eq3 2016-05-10 13:20:00 40 30 10 2016-05-10 13:40:00 40 10 20 df2: TIMESTAMP eq1 eq2 eq3 2016-05-10 13:20:00 10 20 30 2016-05-10 13:40:00 10 20 20 I would like to divide df1 by df2 : each column of df1 by all column of df2 to get this result df3 : TIMESTAMP eq1 eq2 eq3 2016-05-10 13:20:00 40/(10+10) 30/(20+20) 10/(30+20) 2016-05-10 13:40:00 40/(10+10) 10/(20+20) 20/(30+20) Any idea please? *80* I have a data frame with a column named SAM with following data SAM 3 5 9 Nan Nan 24 40 Nan 57 Now I want to Insert 12, 15 and 43 respectively in the Nan values (because 9+3=12, 12+3=15, and 40+3=43). In other words, fill any Nan row by adding 3 to previous row (which can also be Nan). I know this can be done by iterating through a for loop. But can we do it in a vectorized manner? Like some modified version of ffill (which could have been used here if we didn't have consecutive NaNs) in pandas.fillna(). *81* I have the following pandas dataframe df: index A B C 1 1 2 3 2 9 5 4 3 7 12 8 ... ... ... ... I want the maximum value of each row to remain unchanged, and all the other values to become -1. The output would thus look like this : index A B C 1 -1 -1 3 2 9 -1 -1 3 -1 12 -1 ... ... ... ... By using df.max(axis = 1), I get a pandas Series with the maximum values per row. However, I'm not sure how to use these maximums optimally to create the result I need. I'm looking for a vectorized, fast implementation. *82* I want to select all rows in a dataframe which contain values defined in a list. I've got two approaches which both do not work as expected/wanted. My dataframe looks something like this: Timestamp DEVICE READING VALUE 1 | DEV1 | READ1 | randomvalue 2 | DEV1 | READ2 | randomvalue 3 | DEV2 | READ1 | randomvalue 4 | DEV2 | READ2 | randomvalue 5 | DEV3 | READ1 | randomvalue and I've got the list (ls) like follows: [[DEV1, READ1], [DEV1, READ2], [DEV2,READ1]] In this scenario I want to remove line 4 and 5: My first approach was: df = df[(df['DEVICE']. isin([ls[i][0] for i in range(len(ls))])) & (df['READING'].isin([ls[k][1] for k in range(len(ls))]))] The problem with this one is obviously, that it does not remove line 4, because DEV2 has the READING READ2, but it should remove it. My second approach was: df = df[(df[['DEVICE','READING']].isin({'DEVICE': [ls[i][0] for i in range(len(ls))], 'READING': [ls[i][1] for i in range(len(ls))] }))] This one selects the correct rows but it does not remove the other rows. Instead it sets every other cell to NaN, including the VALUE ROW, which i do want to keep. And It does not accumulate both so row 4 looks like 4 |DEV2|NaN|NaN What would be the easiest or best way, to solve this problem? Can you help me? *83* I have following two dataframes: >>> df1 c1 c2 v1 v2 0 A NaN 9 2 1 B NaN 2 5 2 C NaN 3 5 3 D NaN 4 2 >>> df2 c1 c2 v1 v2 0 A P 4 1 1 A T 3 1 2 A Y 2 0 3 B P 0 1 4 B T 2 2 5 B Y 0 2 6 C P 1 2 7 C T 1 2 8 C Y 1 1 9 D P 1 1 10 D T 2 0 11 D Y 1 1 I need to concatenate the dataframes and sort them or vice versa. The first dataframe needs to be sorted on v1 column, then the second dataframe needs to be sorted based on the order of the values from c1 column after sorting the first dataframe, and the v2 column from the second dataframe. A working version is something like this: sorting first dataframe on v1, then iterating the rows, and filtering the second dataframe for the value of c2 column, and sorting the filtered second dataframe on v2, finally concatenating all the frames. result = [] for i,row in df1.sort_values('v1').iterrows(): result.append(row.to_frame().T) result.append(df2[df2['c1'].eq(row['c1'])].sort_values('v2')) The resulting dataframe after sorting: >>> pd.concat(result, ignore_index=True) c1 c2 v1 v2 0 B NaN 2 5 1 B P 0 1 2 B T 2 2 3 B Y 0 2 4 C NaN 3 5 5 C Y 1 1 6 C P 1 2 7 C T 1 2 8 D NaN 4 2 9 D T 2 0 10 D P 1 1 11 D Y 1 1 12 A NaN 9 2 13 A Y 2 0 14 A P 4 1 15 A T 3 1 The problem with above approach is its iterative, and not so efficient when the number of dataframes increases and/or the number of rows increases in these dataframes. The real use-case scenario has from 2 to 6 dataframes, where number of rows ranges from few thousands to hundred thousands. 84. index:5013 score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 1 1 0 1 0 0 1 1 0 0 1 0.5 Function 0 0 1 0 1 1 1 0 0 1 1 0.5 A1 1 0 0 0 0 0 0 0 0 0 1 0.1 A2 0 1 0 0 1 0 1 1 0 0 1 0.4 A3 1 0 1 0 0 0 0 0 1 0 1 0.3 A4 0 0 0 0 0 0 0 1 0 0 1 0.1 A5 A6 0 0 0 0 0 0 0 0 0 0 0 0 A7 A8 html 1 1 1 1 1 1 1 1 1 0 1 0.9 html_A3 0 0 0 1 1 0 0 0 0 1 1 0.3 html_A4 0 0 0 0 0 0 0 0 0 0 0 0 html_A6 0 0 0 0 0 0 1 0 0 0 1 0.1 2-shot 1 1 1 1 1 1 1 1 1 0 1 0.9 Origin: Problem: Simple DataFrame: df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']}) df A B C 0 1 0 a 1 1 1 b 2 2 2 c 3 2 3 d I wish for every value (groupby) of column A, to get the value of column C, for which column B is maximum. For example for group 1 of column A, the maximum of column B is 1, so I want the value "b" of column C: A C 0 1 b 1 2 d No need to assume column B is sorted, performance is of top priority, then elegance. Code: import pandas as pd df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) test: def g(df): return df.sort_values('B').groupby('A', as_index=False).last()[['A', 'C']] df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']}) print(pd.testing.assert_frame_equal(g(df.copy()), result)) Function: Problem: Simple DataFrame: df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']}) df A B C 0 1 0 a 1 1 1 b 2 2 2 c 3 2 3 d I wish for every value (groupby) of column A, to get the value of column C, for which column B is maximum. For example for group 1 of column A, the maximum of column B is 1, so I want the value "b" of column C: A C 0 1 b 1 2 d No need to assume column B is sorted, performance is of top priority, then elegance. import pandas as pd def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return result test: def g(df): return df.sort_values('B').groupby('A', as_index=False).last()[['A', 'C']] df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']}) print(pd.testing.assert_frame_equal(g(df.copy()), f(df.copy()))) A1: Problem: I have a DataFrame containing 3 columns:A,B,C. I wish for every value (groupby) of column A, to get the value of column C, for which column B is maximum. For example: df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']}) df A B C 0 1 0 a 1 1 1 b 2 2 2 c 3 2 3 d desired: A C 0 1 b 1 2 d Code: import pandas as pd df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) test: def g(df): return df.sort_values('B').groupby('A', as_index=False).last()[['A', 'C']] df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']}) print(pd.testing.assert_frame_equal(g(df.copy()), result)) A2: Problem: Simple DataFrame: df = pd.DataFrame({'A': [1,1,2,2], 'B': [3,2,1,0], 'C': ['a','b','c','d']}) df A B C 0 1 3 a 1 1 2 b 2 2 1 c 3 2 0 d I wish for every value (groupby) of column A, to get the value of column C, for which column B is maximum. For example for group 1 of column A, the maximum of column B is 1, so I want the value "b" of column C: A C 0 1 a 1 2 c No need to assume column B is sorted, performance is of top priority, then elegance. Code: import pandas as pd df = pd.DataFrame({'A': [1,1,2,2], 'B': [3,2,1,0], 'C': ['a','b','c','d']}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) test: def g(df): return df.sort_values('B').groupby('A', as_index=False).last()[['A', 'C']] df = pd.DataFrame({'A': [1,1,2,2], 'B': [3,2,1,0], 'C': ['a','b','c','d']}) print(pd.testing.assert_frame_equal(g(df.copy()), result)) A3: Problem: Simple DataFrame: df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']}) df A B C 0 1 0 a 1 1 1 b 2 2 2 c 3 2 3 d I wish for every value (groupby) of column A, to get the value of column C, for which column B is minimum. For example for group 1 of column A, the minimum of column B is 0, so I want the value "a" of column C: A C 0 1 a 1 2 c No need to assume column B is sorted, performance is of top priority, then elegance. Code: import pandas as pd df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) test: def g(df): return df.sort_values('B').groupby('A', as_index=False).first()[['A', 'C']] df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']}) print(pd.testing.assert_frame_equal(g(df.copy()), result)) A4: Problem: Simple DataFrame: df = pd.DataFrame({'A': [0,1,2,3], 'B': [1,1,2,2], 'C': ['a','b','c','d']}) df A B C 0 0 1 a 1 1 1 b 2 2 2 c 3 3 2 d I wish for every value (groupby) of column B, to get the value of column C, for which column A is maximum. For example for group 1 of column B, the maximum of column A is 1, so I want the value "b" of column C: B C 0 1 b 1 2 d No need to assume column A is sorted, performance is of top priority, then elegance. Code: import pandas as pd df = pd.DataFrame({'A': [0,1,2,3], 'B': [1,1,2,2], 'C': ['a','b','c','d']}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) test: def g(df): return df.sort_values('A').groupby('B', as_index=False).last()[['B', 'C']] df = pd.DataFrame({'A': [0,1,2,3], 'B': [1,1,2,2], 'C': ['a','b','c','d']}) print(pd.testing.assert_frame_equal(g(df.copy()), result)) A6: Problem: Simple DataFrame: df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']}) df A B C 0 1 0 a 1 1 1 b 2 2 2 c 3 2 3 d I wish for every value (groupby) of column A, to get the value of column C and B, for which column B is maximum. For example for group 1 of column A, the maximum of column B is 1, so I want the value "b" of column C: A B C 0 1 1 b 1 2 3 d No need to assume column B is sorted, performance is of top priority, then elegance. Code: import pandas as pd df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) test: def g(df): return df.sort_values('B').drop_duplicates(['A'],keep='last') df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']}) print(pd.testing.assert_frame_equal(g(df.copy()), result)) html:

Simple DataFrame:

df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']})
df
   A  B  C
0  1  0  a
1  1  1  b
2  2  2  c
3  2  3  d

I wish for every value (groupby) of column A, to get the value of column C, for which column B is maximum. For example for group 1 of column A, the maximum of column B is 1, so I want the value "b" of column C:

   A  C
0  1  b
1  2  d

No need to assume column B is sorted, performance is of top priority, then elegance.

A: # import pandas as pd df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) # test: def g(df): return df.sort_values('B').groupby('A', as_index=False).last()[['A', 'C']] df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']}) print(pd.testing.assert_frame_equal(g(df.copy()), result)) html_A3:

Simple DataFrame:

df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']})
df
   A  B  C
0  1  0  a
1  1  1  b
2  2  2  c
3  2  3  d

I wish for every value (groupby) of column A, to get the value of column C, for which column B is minimum. For example for group 1 of column A, the minimum of column B is 0, so I want the value "a" of column C:

   A  C
0  1  a
1  2  c

No need to assume column B is sorted, performance is of top priority, then elegance.

A: # import pandas as pd df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) # test: def g(df): return df.sort_values('B').groupby('A', as_index=False).first()[['A', 'C']] df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']}) print(pd.testing.assert_frame_equal(g(df.copy()), result)) html_A4:

Simple DataFrame:

df = pd.DataFrame({'A': [0,1,2,3], 'B': [1,1,2,2], 'C': ['a','b','c','d']})
df
   A  B  C
0  0  1  a
1  1  1  b
2  2  2  c
3  3  2  d

I wish for every value (groupby) of column B, to get the value of column C, for which column A is maximum. For example for group 1 of column B, the maximum of column A is 1, so I want the value "b" of column C:

   B  C
0  1  b
1  2  d

No need to assume column A is sorted, performance is of top priority, then elegance.

A: # import pandas as pd df = pd.DataFrame({'A': [0,1,2,3], 'B': [1,1,2,2], 'C': ['a','b','c','d']}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) # test: def g(df): return df.sort_values('A').groupby('B', as_index=False).last()[['B', 'C']] df = pd.DataFrame({'A': [0,1,2,3], 'B': [1,1,2,2], 'C': ['a','b','c','d']}) print(pd.testing.assert_frame_equal(g(df.copy()), result)) html_A6:

Simple DataFrame:

df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']})
df
   A  B  C
0  1  0  a
1  1  1  b
2  2  2  c
3  2  3  d

I wish for every value (groupby) of column A and B, to get the value of column C, for which column B is maximum. For example for group 1 of column A, the maximum of column B is 1, so I want the value "b" of column C:

   A  B  C
0  1  1  b
1  2  3  d

No need to assume column B is sorted, performance is of top priority, then elegance.

A: # import pandas as pd df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) # test: def g(df): return df.sort_values('B').groupby('A', as_index=False).last() df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']}) print(pd.testing.assert_frame_equal(g(df.copy()), result)) 85. If I have a Pandas dataframe, and a column that is a datetime type, I can get the year as follows: df['year'] = df['date'].dt.year With a dask dataframe, that does not work. If I compute first, like this: df['year'] = df['date'].compute().dt.year I get ValueError: Not all divisions are known, can't align partitions. Please useset_indexorset_partitionto set the index. But if I do: df['date'].head().dt.year it works fine! So how do I get the year (or week) of a datetime series in a dask dataframe? score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 0 1 1 1 1 1 1 1 1 1 1 0.9 Function 1 1 1 0 1 1 0 1 0 0 1 0.6 A1 0 0 1 1 1 0 1 1 1 1 1 0.7 A2 1 1 1 1 1 1 1 1 1 1 1 1 A3 0 1 1 1 0 1 1 1 1 1 1 0.8 A4 A5 A6 A7 1 0 1 0 1 1 1 1 1 1 1 0.8 A8 html 1 1 1 1 1 1 1 1 1 1 1 1 html_A3 1 1 1 1 1 1 1 0 1 1 1 0.9 html_A7 1 1 0 1 0 1 1 1 1 1 1 0.8 Origin: Problem: I have df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) id stuff val 0 A 12 1 1 B 23232 2 2 A 13 -3 3 C 1234 1 4 D 3235 5 5 B 3236 6 6 C 732323 -2 I'd like to get a running sum of val for each id, so the desired output looks like this: id stuff val cumsum 0 A 12 1 1 1 B 23232 2 2 2 A 13 -3 -2 3 C 1234 1 1 4 D 3235 5 5 5 B 3236 6 8 6 C 732323 -2 -1 This is what I tried: df['cumsum'] = df.groupby('id').cumsum(['val']) and df['cumsum'] = df.groupby('id').cumsum(['val']) This is the error I get: ValueError: Wrong number of items passed 0, placement implies 1 code: import pandas as pd df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(df) ans=df test: def g(df): df['cumsum'] = df.groupby('id')['val'].transform(pd.Series.cumsum) return df df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) print(pd.testing.assert_frame_equal(g(df.copy()), ans, check_dtype=False)) Function: Problem: I have df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) id stuff val 0 A 12 1 1 B 23232 2 2 A 13 -3 3 C 1234 1 4 D 3235 5 5 B 3236 6 6 C 732323 -2 I'd like to get a running sum of val for each id, so the desired output looks like this: id stuff val cumsum 0 A 12 1 1 1 B 23232 2 2 2 A 13 -3 -2 3 C 1234 1 1 4 D 3235 5 5 5 B 3236 6 8 6 C 732323 -2 -1 This is what I tried: df['cumsum'] = df.groupby('id').cumsum(['val']) and df['cumsum'] = df.groupby('id').cumsum(['val']) This is the error I get: ValueError: Wrong number of items passed 0, placement implies 1 code: import pandas as pd def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return result test: def g(df): df['cumsum'] = df.groupby('id')['val'].transform(pd.Series.cumsum) return df ### test1 df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) print(f(df.copy())) print(pd.testing.assert_frame_equal(g(df.copy()), f(df.copy()), check_dtype=False)) ### test2 df = pd.DataFrame({'id': ['A', 'B']*10 +['C'] * 10,'val': np.random.randint(0 ,100 ,30)}) print(pd.testing.assert_frame_equal(g(df.copy()), f(df.copy()), check_dtype=False)) ### test6 random.choice df = pd.DataFrame({'id': np.random.choice(list('ABCDE'), 1000),'val': np.random.randint(-1000, 1000, 1000)}) print(pd.testing.assert_frame_equal(g(df.copy()), f(df.copy()), check_dtype=False)) A1: Problem: I have a dataframe containing 2 columns: id and val. I want to get a running sum of val for each id: For example: df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) id stuff val 0 A 12 1 1 B 23232 2 2 A 13 -3 3 C 1234 1 4 D 3235 5 5 B 3236 6 6 C 732323 -2 desired: id stuff val cumsum 0 A 12 1 1 1 B 23232 2 2 2 A 13 -3 -2 3 C 1234 1 1 4 D 3235 5 5 5 B 3236 6 8 6 C 732323 -2 -1 code: import pandas as pd df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(df) ans=df test: def g(df): df['cumsum'] = df.groupby('id')['val'].transform(pd.Series.cumsum) return df df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) print(pd.testing.assert_frame_equal(g(df.copy()), ans, check_dtype=False)) A2: Problem: I have df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'B'], 'val': [1,2,-3,6], 'stuff':['12','23232','13','1234','3235','3236','732323']}) id stuff val 0 A 12 1 1 B 23232 2 2 A 13 -3 3 B 3236 6 I'd like to get a running sum of val for each id, so the desired output looks like this: id stuff val cumsum 0 A 12 1 1 1 B 23232 2 2 2 A 13 -3 -2 3 B 3236 6 8 This is what I tried: df['cumsum'] = df.groupby('id').cumsum(['val']) and df['cumsum'] = df.groupby('id').cumsum(['val']) This is the error I get: ValueError: Wrong number of items passed 0, placement implies 1 code: import pandas as pd df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(df) ans=df test: def g(df): df['cumsum'] = df.groupby('id')['val'].transform(pd.Series.cumsum) return df df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) print(pd.testing.assert_frame_equal(g(df.copy()), ans, check_dtype=False)) A3: Problem: I have df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) id stuff val 0 A 12 1 1 B 23232 2 2 A 13 -3 3 C 1234 1 4 D 3235 5 5 B 3236 6 6 C 732323 -2 I'd like to get a running max of val for each id, so the desired output looks like this: id stuff val cummax 0 A 12 1 1 1 B 23232 2 2 2 A 13 -3 1 3 C 1234 1 1 4 D 3235 5 5 5 B 3236 6 6 6 C 732323 -2 1 This is what I tried: df['cummax'] = df.groupby('id').cummax(['val']) and df['cummax'] = df.groupby('id').cummax(['val']) This is the error I get: ValueError: Wrong number of items passed 0, placement implies 1 code: import pandas as pd df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(df) ans=df test: def g(df): df['cummax'] = df.groupby('id')['val'].transform(pd.Series.cummax) return df df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) print(pd.testing.assert_frame_equal(g(df.copy()), ans, check_dtype=False)) A7: Problem: I have df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) id stuff val 0 A 12 1 1 B 23232 2 2 A 13 -3 3 C 1234 1 4 D 3235 5 5 B 3236 6 6 C 732323 -2 I'd like to get a running sum of val for each id and if the sum is negative,set it to 0, so the desired output looks like this: id stuff val cumsum 0 A 12 1 1 1 B 23232 2 2 2 A 13 -3 0 3 C 1234 1 1 4 D 3235 5 5 5 B 3236 6 8 6 C 732323 -2 0 This is what I tried: df['cumsum'] = df.groupby('id').cumsum(['val']) and df['cumsum'] = df.groupby('id').cumsum(['val']) This is the error I get: ValueError: Wrong number of items passed 0, placement implies 1 code: import pandas as pd df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) ### BEGIN SOLUTION [insert] ### END SOLUTION print(df) ans=df test: def g(df): df['cumsum'] = df.groupby('id')['val'].transform(pd.Series.cumsum) df['cumsum'] = df['cumsum'].where(df['cumsum'] > 0, 0) return df 86 This is an example of the data frame i'm working with: d = { 'item_number':['bdsm1000', 'bdsm1000', 'bdsm1000', 'ZZRWB18','ZZRWB18', 'ZZRWB18', 'ZZRWB18', 'ZZHP1427BLK', 'ZZHP1427', 'ZZHP1427', 'ZZHP1427', 'ZZHP1427', 'ZZHP1427', 'ZZHP1427', 'ZZHP1427', 'ZZHP1427', 'ZZHP1427', 'ZZHP1427', 'ZZHP1427', 'ZZHP1427', 'ZZHP1414', 'ZZHP1414', 'ZZHP1414', 'WRM115WNTR', 'WRM115WNTR', 'WRM115WNTR', 'WRM115WNTR', 'WRM115WNTR', 'WRM115WNTR', 'WRM115WNTR', 'WRM115WNTR', 'WRM115WNTR', 'WRM115WNTR', 'WRM115WNTR', 'WRM115WNTR', 'WRM115WNTR', 'WRM115SCFRE', 'WRM115SCFRE', 'WRM115SCFRE', 'WRM115SCFRE', 'WRM115SCFRE', 'WRM115SCFRE', 'WRM115SCFRE', 'WRM115SCFRE', 'WRM115SCFRE', 'WRM115SCFRE', 'WRM115SCFRE', 'WRM115SCFRE', 'WRM115SCFRE', 'WRM115SCFRE'], 'Comp_ID':[2454, 2454, 2454, 1395, 1395, 1395, 1395, 3378, 1266941, 660867, 43978, 1266941, 660867, 43978, 1266941, 660867, 43978, 1266941, 660867, 43978, 43978, 43978, 43978, 1197347907, 70745, 4737, 1197347907, 4737, 1197347907, 70745, 4737, 1197347907, 70745, 4737, 1197347907, 4737, 1197487704, 1197347907, 70745, 23872, 4737, 1197347907, 4737, 1197487704, 1197347907, 23872, 4737, 1197487704, 1197347907, 70745], 'date':['2016-11-22', '2016-11-20', '2016-11-19', '2016-11-22', '2016-11-20', '2016-11-19', '2016-11-18', '2016-11-22', '2016-11-22', '2016-11-22', '2016-11-22', '2016-11-20', '2016-11-20', '2016-11-20', '2016-11-19', '2016-11-19', '2016-11-19', '2016-11-18', '2016-11-18', '2016-11-18', '2016-11-22', '2016-11-20', '2016-11-19', '2016-11-22', '2016-11-22', '2016-11-22', '2016-11-21', '2016-11-21', '2016-11-20', '2016-11-20', '2016-11-20', '2016-11-19', '2016-11-19', '2016-11-19', '2016-11-18', '2016-11-18', '2016-11-22', '2016-11-22', '2016-11-22', '2016-11-22', '2016-11-22', '2016-11-21', '2016-11-21', '2016-11-20', '2016-11-20', '2016-11-20', '2016-11-20', '2016-11-19', '2016-11-19', '2016-11-19']} df = pd.DataFrame(data=d) df.date = pd.to_datetime(df.date) I'd like to count consecutive observations starting from 2016-11-22 that there are grouped by Comp_ID and item_number. Essentially, what I am looking to do, is count how many days in a row there is an observation counting back from todays date for each Comp_ID and item_number. (this example was put together on the 22nd of Nov) Consecutive observations observed weeks/ days prior to today are not relevant. Only sequences like today... yesterday... the day before yesterday... and so on are relevant. I got this to work on a smaller sample, but it seems to be getting tripped up on a larger data-set. Here is the code for the smaller sample. I need to find the consecutive dates with observations across thousands of sellers/ items. For some reason, the below code did not work on the larger data set. d = {'item_number':['KIN005','KIN005','KIN005','KIN005','KIN005','A789B','A789B','A789B','G123H','G123H','G123H'], 'Comp_ID':['1395','1395','1395','1395','1395','7787','7787','7787','1395','1395','1395'], 'date':['2016-11-22','2016-11-21','2016-11-20','2016-11-14','2016-11-13','2016-11-22','2016-11-21','2016-11-12','2016-11-22','2016-11-21','2016-11-08']} df = pd.DataFrame(data=d) df.date = pd.to_datetime(df.date) d = pd.Timedelta(1, 'D') df = df.sort_values(['item_number','date','Comp_ID'],ascending=False) g = df.groupby(['Comp_ID','item_number']) sequence = g['date'].apply(lambda x: x.diff().fillna(0).abs().le(d)).reset_index() sequence.set_index('index',inplace=True) test = df.join(sequence) test.columns = ['Comp_ID','date','item_number','consecutive'] g = test.groupby(['Comp_ID','item_number']) g['consecutive'].apply(lambda x: x.idxmin() - x.idxmax() ) This gets the desired result for the smaller data-set: Comp_ID item_number 1395 G123H 2 KIN005 3 7787 KIN005 2 Name: consecutive, dtype: int64 *87* I have a dataframe(edata) as given below Domestic Catsize Type Count 1 0 1 1 1 1 1 8 1 0 2 11 0 1 3 14 1 1 4 21 0 1 4 31 From this dataframe I want to calculate the sum of all counts where the logical AND of both variables (Domestic and Catsize) results in Zero (0) such that 1 0 0 0 1 0 0 0 0 The code I use to perform the process is g=edata.groupby('Type') q3=g.apply(lambda x:x[((x['Domestic']==0) & (x['Catsize']==0) | (x['Domestic']==0) & (x['Catsize']==1) | (x['Domestic']==1) & (x['Catsize']==0) )] ['Count'].sum() ) q3 Type 1 1 2 11 3 14 4 31 This code works fine, however, if the number of variables in the dataframe increases then the number of conditions grows rapidly. So, is there a smart way to write a condition that states that if the ANDing the two (or more) variables result in a zero then perform the sum() function *88* I am trying to take the rowwise max (and min) of two columns containing dates from datetime import date import pandas as pd import numpy as np df = pd.DataFrame({'date_a' : [date(2015, 1, 1), date(2012, 6, 1), date(2013, 1, 1), date(2016, 6, 1)], 'date_b' : [date(2012, 7, 1), date(2013, 1, 1), date(2014, 3, 1), date(2013, 4, 1)]}) df[['date_a', 'date_b']].max(axis=1) Out[46]: 0 2015-01-01 1 2013-01-01 2 2014-03-01 3 2016-06-01 as expected. However, if the dataframe contains a single NaN value, the whole operation fails df_nan = pd.DataFrame({'date_a' : [date(2015, 1, 1), date(2012, 6, 1), np.NaN, date(2016, 6, 1)], 'date_b' : [date(2012, 7, 1), date(2013, 1, 1), date(2014, 3, 1), date(2013, 4, 1)]}) df_nan[['date_a', 'date_b']].max(axis=1) Out[49]: 0 NaN 1 NaN 2 NaN 3 NaN dtype: float64 What is going on here? I was expecting this result 0 2015-01-01 1 2013-01-01 2 NaN 3 2016-06-01 How can this be achieved? *89* And the copy has to be done for 'City' column starting with 'BH'. The copied df.index shouls be same as the original Eg - STATE CITY 315 KA BLR 423 WB CCU 554 KA BHU 557 TN BHY # state_df is new dataframe, df is existing state_df = pd.DataFrame(columns=['STATE', 'CITY']) for index, row in df.iterrows(): city = row['CITY'] if(city.startswith('BH')): append row from df to state_df # pseudocode Being new to pandas and Python, I need help in the pseudocode for the most efficient way. *90* I am trying to delete some rows from my dataframe. In fact I want to delete the the first n rows, while n should be the row number of a certain condition. I want the dataframe to start with the row that contains the x-y values xEnd,yEnd. All earlier rows shall be dropped from the dataframe. Somehow I do not get the solution. That is what i have so far. Example: import pandas as pd xEnd=2 yEnd=3 df = pd.DataFrame({'x':[1,1,1,2,2,2], 'y':[1,2,3,3,4,3], 'id':[0,1,2,3,4,5]}) n=df["id"].iloc[df["x"]==xEnd and df["y"]==yEnd] df = df.iloc[n:] I want my code to reduce the dataframe from {'x':[1,1,1,2,2,2], 'y':[1,2,3,3,4,3], 'id':[0,1,2,3,4,5]} to {'x':[2,2,2], 'y':[3,4,3], 'id':[3,4,5]} *91* I have this: df['new'] = df[['col1', 'col2']].pct_change(axis=1) I want the percent change across rows in col1 and col2. However I am getting the error: ValueError: Wrong number of items passed 2, placement implies 1 What am I doing wrong? 92. index:6019 Score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 1 0 1 1 0 1 1 0 1 1 1 0.7 Function 0 0 0 0 0 0 1 0 0 0 1 0.1 A1 0 0 1 1 1 0 1 1 1 1 1 0.7 A2 1 1 1 1 0 0 1 1 1 0 1 0.7 A3 1 1 0 1 0 1 1 0 1 0 1 0.6 A4 A5 0 0 0 1 0 1 0 0 0 0 1 0.2 A6 A7 A8 html 1 1 1 1 1 1 1 1 1 1 1 1 html_A3 1 1 1 1 1 1 1 1 1 1 1 1 html_A5 0 0 0 0 0 0 0 0 0 0 0 0 2-shot 1 1 1 1 1 0 1 1 1 1 0 0.9 2-shot-A1 1 1 1 1 1 0 1 1 1 0 0 0.8 2-shot-A2 1 1 1 1 1 1 1 1 0 1 0 0.9 2-shot-A3 1 1 1 1 1 0 1 1 1 0 0 0.8 2-shot-A5 0 0 0 0 0 0 0 0 0 0 0 0 Origin: Problem: Given: d = { 'High': [954, 953, 952, 955, 956, 952, 951, 950, ] } df = pandas.DataFrame(d) I want to add another column which is the max at each index from the beginning. For example the desired column would be: 'Max': [954, 954, 954, 955, 956, 956, 956, 956] I tried with a pandas rolling function but the window cannot be dynamic it seems Code: import pandas as pd d = { 'High': [954, 953, 952, 955, 956, 952, 951, 950, ] } df = pd.DataFrame(d) ### BEGIN SOLUTION [insert] ### END SOLUTION result = df Test: def g(df): df['Max'] = df.High.cummax() return df df = pd.DataFrame(d) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) Function: Problem: Given: d = { 'High': [954, 953, 952, 955, 956, 952, 951, 950, ] } df = pandas.DataFrame(d) I want to add another column which is the max at each index from the beginning. For example the desired column would be: 'Max': [954, 954, 954, 955, 956, 956, 956, 956] I tried with a pandas rolling function but the window cannot be dynamic it seems Code: import pandas as pd def f(df): ### BEGIN SOLUTION [insert] ### END SOLUTION return result Test: def g(df): # result = df.copy() # result['Max'] = df['High'].rolling(window=df.index.size, min_periods=1).max() df['Max'] = df.High.cummax() return df ### test1 df = pd.DataFrame({'High': [954, 953, 952, 955, 956, 952, 951, 950]}) print(f(df.copy())) print(pd.testing.assert_frame_equal(g(df.copy()), f(df.copy()), check_dtype=False)) ### test2 df = pd.DataFrame({'High': [42, 21] * 2 + [2]}) print(pd.testing.assert_frame_equal(g(df), f(df), check_dtype=False)) ### test3 df = pd.DataFrame({'High': list(range(100)) + list(range(-100, 0))}) print(pd.testing.assert_frame_equal(g(df), f(df), check_dtype=False)) A1: Problem: Given: d = { 'High': [954, 953, 952, 955, 956, 952, 951, 950, ] } df = pandas.DataFrame(d) For each element, I want to get its maximum value from the beginning to add it to the DataFrame as a new column ’Max’. For example the desired column would be: 'Max': [954, 954, 954, 955, 956, 956, 956, 956] I tried with a pandas rolling function but the window cannot be dynamic it seems Code: import pandas as pd d = { 'High': [954, 953, 952, 955, 956, 952, 951, 950, ] } df = pd.DataFrame(d) ### BEGIN SOLUTION [insert] ### END SOLUTION result = df Test: def g(df): # result = df.copy() # result['Max'] = df['High'].rolling(window=df.index.size, min_periods=1).max() df['Max'] = df.High.cummax() return df df = pd.DataFrame(d) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) A2: Problem: Given: d = { 'High': [2, 3, 2, 5, 6, 2, 1, 10] } df = pandas.DataFrame(d) I want to add another column which is the max at each index from the beginning. For example the desired column would be: 'Max': [2, 3, 3, 5, 6, 6, 6, 10] I tried with a pandas rolling function but the window cannot be dynamic it seems Code: import pandas as pd d = { 'High': [2, 3, 2, 5, 6, 2, 1, 10, ] } df = pd.DataFrame(d) ### BEGIN SOLUTION [insert] ### END SOLUTION result = df Test: def g(df): df['Max'] = df.High.cummax() return df df = pd.DataFrame(d) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) A3: Problem: Given: d = { 'High': [954, 953, 952, 955, 956, 952, 951, 950, ] } df = pandas.DataFrame(d) I want to add another column which is the min at each index from the beginning. For example the desired column would be: 'Min': [954, 953, 952, 952, 952, 952, 951, 950] I tried with a pandas rolling function but the window cannot be dynamic it seems Code: import pandas as pd d = { 'High': [954, 953, 952, 955, 956, 952, 951, 950, ] } df = pd.DataFrame(d) ### BEGIN SOLUTION [insert] ### END SOLUTION result = df Test: def g(df): df['Min'] = df.High.cummin() return df df = pd.DataFrame(d) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) A5: Problem: Given: d = { 'High': [954, 953, 952, 955, 956, 952, 951, 950, ] } df = pandas.DataFrame(d) I want to add another column which is the max at each index from the current index to the end. For example the desired column would be: 'Max': [956, 956, 956, 956, 956, 952, 951, 950] I tried with a pandas rolling function but the window cannot be dynamic it seems Code: import pandas as pd d = { 'High': [954, 953, 952, 955, 956, 952, 951, 950, ] } df = pd.DataFrame(d) ### BEGIN SOLUTION [insert] ### END SOLUTION result = df Test: def g(df): df = df.reindex(index=df.index[::-1]) df['Max'] = df.High.cummax() df = df.reindex(index=df.index[::-1]) return df df = pd.DataFrame(d) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) html:

Given:

d = {
    'High': [954,
             953,
             952,
             955,
             956,
             952,
             951,
             950,
            ]
}
df = pandas.DataFrame(d)

I want to add another column which is the max at each index from the beginning. For example the desired column would be:

'Max': [954, 
        954, 
        954, 
        955, 
        956, 
        956, 
        956, 
        956]

I tried with a pandas rolling function but the window cannot be dynamic it seems

A: import pandas as pd d = { 'High': [954, 953, 952, 955, 956, 952, 951, 950, ] } df = pd.DataFrame(d) ### BEGIN SOLUTION [insert] ### END SOLUTION result = df Test: def g(df): df['Max'] = df.High.cummax() return df df = pd.DataFrame(d) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) html_A3:

Given:

d = {
    'High': [954,
             953,
             952,
             955,
             956,
             952,
             951,
             950,
            ]
}
df = pandas.DataFrame(d)

I want to add another column which is the min at each index from the beginning. For example the desired column would be:

'Min': [954, 
        954, 
        953, 
        952, 
        952, 
        952, 
        951, 
        950]

I tried with a pandas rolling function but the window cannot be dynamic it seems

A: import pandas as pd d = { 'High': [954, 953, 952, 955, 956, 952, 951, 950, ] } df = pd.DataFrame(d) ### BEGIN SOLUTION [insert] ### END SOLUTION result = df Test: def g(df): df['Min'] = df.High.cummin() return df df = pd.DataFrame(d) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) html_A5:

Given:

d = {
    'High': [954,
             953,
             952,
             955,
             956,
             952,
             951,
             950,
            ]
}
df = pandas.DataFrame(d)

I want to add another column which is the max at each index from the current index to the end. For example the desired column would be:

'Max': [956, 
        956, 
        956, 
        956, 
        956, 
        952, 
        951, 
        950]

I tried with a pandas rolling function but the window cannot be dynamic it seems

A: import pandas as pd d = { 'High': [954, 953, 952, 955, 956, 952, 951, 950, ] } df = pd.DataFrame(d) ### BEGIN SOLUTION [insert] ### END SOLUTION result = df Test: def g(df): df = df.reindex(index=df.index[::-1]) df['Max'] = df.High.cummax() df = df.reindex(index=df.index[::-1]) return df df = pd.DataFrame(d) print(pd.testing.assert_frame_equal(g(df.copy()), result, check_dtype=False)) 93 I have a pandas DataFrame with a DateTimeIndex: A B 2016-04-25 18:50:06 440.967796 201.049600 2016-04-25 18:50:13 441.054995 200.767034 2016-04-25 18:50:20 441.142337 200.484475 ... 2016-07-27 18:50:06 440.967796 201.049600 2016-07-27 18:50:13 441.054995 200.767034 2016-07-27 18:50:20 441.142337 200.484475 I would like to extract all the data of a given date yyyy-mm-dd using a list of dates: ['2016-04-25','2016-04-28',...] I tried the following: df[df.index.isin(['2016-04-25', '2016-04-26'])] Empty DataFrame I would like to retrieve all the data (data of the whole day) of the dates given in this list *94* I have two dataframes, say A and B, that have some columns named attr1, attr2, attrN. I have a certain distance measure, and I would like to merge the dataframes, such that each row in A is merged with the row in B that has the shortest distance between attributes. Note that rows in B can be repeated when merging. For example (with one attribute to keep things simple), merging these two tables using absolute difference distance |A.attr1 - B.att1| A | attr1 B | attr1 0 | 10 0 | 15 1 | 20 1 | 27 2 | 30 2 | 80 should yield the following merged table M | attr1_A attr1_B 0 | 10 15 1 | 20 15 2 | 30 27 My current way of doing this is slow and is based on comparing each row of A with each row of B, but code is also not clear because I have to preserve indices for merging and I am not satisfied at all, but I cannot come up with a better solution. How can I perform the merge as above using pandas? Are there any convenience methods or functions that can be helpful here? EDIT: Just to clarify, in the dataframes there are also other columns which are not used in the distance calculation, but have to be merged as well. *95* I have 2 similar data frames structured like this : ind = pd.MultiIndex.from_product([['Day 1','Day 2'],['D1','D2'],['Mean','StDev','StErr']], names = ['interval','device','stats']) df = pd.DataFrame({'col1':[1,2,3,4,5,6,7,8,9,10,11,12]}, index = ind) print(df) col1 interval device stats Day 1 D1 Mean 1 StDev 2 StErr 3 D2 Mean 4 StDev 5 StErr 6 Day 2 D1 Mean 7 StDev 8 StErr 9 D2 Mean 10 StDev 11 StErr 12 ind2 = pd.MultiIndex.from_product([['Day 1','Day 2'],['D1','D2'],['Ratio']], names = ['interval','device','stats']) df2 = pd.DataFrame({'col1':[100,200,300,400]}, index = ind2) print(df2) col1 interval device stats Day 1 D1 Ratio 100 D2 Ratio 200 Day 2 D1 Ratio 300 D2 Ratio 400 I'm trying to merge them to get this : col1 interval device stats Day 1 D1 Mean 1 StDev 2 StErr 3 Ratio 100 D2 Mean 4 StDev 5 StErr 6 Ratio 200 Day 2 D1 Mean 7 StDev 8 StErr 9 Ratio 300 D2 Mean 10 StDev 11 StErr 12 Ratio 400 I tried a bunch of different things using join, concat, and merge but the closest I've been able to get is using df3 = pd.concat([df, df2], axis=1). Unfortunately that gives me this : col1 col1 interval device stats Day 1 D1 Mean 1 NaN Ratio NaN 100 StDev 2 NaN StErr 3 NaN D2 Mean 4 NaN Ratio NaN 200 StDev 5 NaN StErr 6 NaN Day 2 D1 Mean 7 NaN Ratio NaN 300 StDev 8 NaN StErr 9 NaN D2 Mean 10 NaN Ratio NaN 400 StDev 11 NaN StErr 12 NaN 96 How to search for a string value on each and every columns using pandas . Lets say I have 32 columns , df[df['A'].str.contains("hello")] this returns whether the value is present in "A" column or not ,How to search on every columns and the row in which the value is exist . Dataset : A B C 1 hi hie 2 bye Hello If I search for "hello" or "Hello" output should be : A B C 2 bye Hello *97* I'm trying to find the column names of each column in a pandas dataframe where the value is greater than that of another column. For example, if I have the following dataframe: A B C D threshold 0 1 3 3 1 2 1 2 3 6 1 5 2 9 5 0 2 4 For each row I would like to return the names of the columns where the values are greater than the threshold, so I would have: 0: B, C 1: C 2: A, B Any help would be much appreciated! 98. index:6031 score: 1 2 3 4 5 6 7 8 9 10 Top-10 Avg Origin 0 0 1 1 0 0 1 1 0 1 1 0.5 Function 1 0 1 1 0 1 0 0 0 1 1 0.5 A1 1 0 1 1 1 1 1 1 1 1 1 0.9 A2 1 0 0 0 0 0 0 1 0 0 1 0.2 A3 A4 A5 A6 A7 0 0 0 0 0 0 0 0 0 0 0 0 A8 html 1 1 1 0 1 1 0 1 1 1 1 0.8 html_A7 0 0 0 1 1 1 0 1 0 1 1 0.5 2-shot 1 1 1 0 1 0 1 1 1 0 1 0.7 2-shot-A2 0 1 0 1 0 1 1 0 1 1 1 0.6 2-shot-A7 0 0 0 0 0 0 0 0 0 0 0 0 Origin: Problem: I have a pandas dataframe like this.. df = pd.DataFrame({'A' : [5,6,3,4,4,5,6,7,12,13], 'B' : [1,2,3,5,5,6,7,8,9,10,]}) and I have an array of indices array = np.array([0,1,2,4,7,8]) Now I can subset the dataframe with the array indices like this df.iloc[array] Which gives me a dataframe with indices present in the array. A B 0 5 1 1 6 2 2 3 3 4 4 5 7 7 8 8 12 9 Now I want all the rows which are not present in the array index, row index which i want is [3,5,6,9] I am trying to do something like this but it gives me an error. df.iloc[~loc] code: import pandas as pd import numpy as np df = pd.DataFrame({'A' : [5,6,3,4,4,5,6,7,12,13], 'B' : [1,2,3,5,5,6,7,8,9,10,]}) array = np.array([0,1,2,4,7,8]) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) test: def g(df, array): return df[~df.index.isin(array)] df1 = pd.DataFrame({'A' : [5,6,3,4,4,5,6,7,12,13], 'B' : [1,2,3,5,5,6,7,8,9,10,]}) array1 = np.array([0,1,2,4,7,8]) print(pd.testing.assert_frame_equal(g(df1.copy(), array1.copy()), result)) Function: Problem: I have a pandas dataframe like this.. df = pd.DataFrame({'A' : [5,6,3,4,4,5,6,7,12,13], 'B' : [1,2,3,5,5,6,7,8,9,10,]}) and I have an array of indices array = np.array([0,1,2,4,7,8]) Now I can subset the dataframe with the array indices like this df.iloc[array] Which gives me a dataframe with indices present in the array. A B 0 5 1 1 6 2 2 3 3 4 4 5 7 7 8 8 12 9 Now I want all the rows which are not present in the array index, row index which i want is [3,5,6,9] I am trying to do something like this but it gives me an error. df.iloc[~loc] code: import pandas as pd import numpy as np def f(df,array): ### BEGIN SOLUTION [insert] ### END SOLUTION return result test: def g(df, array): return df[~df.index.isin(array)] ### test1 df1 = pd.DataFrame({'A' : [5,6,3,4,4,5,6,7,12,13], 'B' : [1,2,3,5,5,6,7,8,9,10,]}) array1 = np.array([0,1,2,4,7,8]) print(g(df1.copy(), array1.copy())) print(pd.testing.assert_frame_equal(g(df1.copy(), array1.copy()), f(df1.copy(), array1.copy()))) ### test2 df2 = pd.DataFrame({'ID' : [7,8,9], 'Name': ['A','B','C']}) array2 = np.array([0,1]) print(pd.testing.assert_frame_equal(g(df2.copy(), array2.copy()), f(df2.copy(), array2.copy()))) A1: Problem: I have a pandas dataframe and an array as indices. Now I want to remove all the rows which are present in the array index. For example: df = pd.DataFrame({'A' : [5,6,3,4,4,5,6,7,12,13], 'B' : [1,2,3,5,5,6,7,8,9,10,]}) array = np.array([0,1,2,4,7,8]) desired: A B 3 4 5 5 5 6 6 6 7 9 13 10 code: import pandas as pd import numpy as np df = pd.DataFrame({'A' : [5,6,3,4,4,5,6,7,12,13], 'B' : [1,2,3,5,5,6,7,8,9,10,]}) array = np.array([0,1,2,4,7,8]) ### BEGIN SOLUTION [insert] ### END SOLUTION print(ans) test: def g(df, array): return df[~df.index.isin(array)] df1 = pd.DataFrame({'A' : [5,6,3,4,4,5,6,7,12,13], 'B' : [1,2,3,5,5,6,7,8,9,10,]}) array1 = np.array([0,1,2,4,7,8]) print(pd.testing.assert_frame_equal(g(df1.copy(), array1.copy()), ans)) A2: Problem: I have a pandas dataframe like this.. df = pd.DataFrame({'ID' : [7,8,9], 'Name': ['A','B','C']}) and I have an array of indices array = np.array([0,1]) Now I can subset the dataframe with the array indices like this df.iloc[array] Which gives me a dataframe with indices present in the array. ID Name 0 7 ‘A’ 1 8 ‘B’ Now I want all the rows which are not present in the array index, row index which i want is [2] I am trying to do something like this but it gives me an error. df.iloc[~loc] code: import pandas as pd import numpy as np df = pd.DataFrame({'ID' : [7,8,9], 'Name': ['A','B','C']}) array = np.array([0,1]) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) test: def g(df, array): return df[~df.index.isin(array)] df1 = pd.DataFrame({'ID' : [7,8,9], 'Name': ['A','B','C']}) array1 = np.array([0,1]) print(pd.testing.assert_frame_equal(g(df1.copy(), array1.copy()), result)) A7: Problem: I have a pandas dataframe like this.. df = pd.DataFrame({'A' : [5,6,3,4,4,5,6,7,12,13], 'B' : [1,2,3,5,5,6,7,8,9,10,]}) and I have an array of indices array = np.array([0,1,2,4,7,8]) Now I can subset the dataframe with the array indices like this df.iloc[array] Which gives me a dataframe with indices present in the array. A B 0 5 1 1 6 2 2 3 3 4 4 5 7 7 8 8 12 9 Now I want all the rows which are not present in the array index and odd, row index which i want is [3,5,9] I am trying to do something like this but it gives me an error. df.iloc[~loc] code: import pandas as pd import numpy as np df = pd.DataFrame({'A' : [5,6,3,4,4,5,6,7,12,13], 'B' : [1,2,3,5,5,6,7,8,9,10,]}) array = np.array([0,1,2,4,7,8]) ### BEGIN SOLUTION [insert] ### END SOLUTION print(ans) test: def g(df, array): return df[np.bitwise_and(~df.index.isin(array),df.index%2==1)] html: Problem:

I have a pandas dataframe like this..

df = pd.DataFrame({'A' : [5,6,3,4,4,5,6,7,12,13], 'B' :
     [1,2,3,5,5,6,7,8,9,10,]})

df

    A   B
0   5   1
1   6   2
2   3   3
3   4   5
4   4   5
5   5   6
6   6   7
7   7   8
8  12   9
9  13  10

and I have an array of indices

array = np.array([0,1,2,4,7,8])

Now I can subset the dataframe with the array indices like this

df.iloc[array]

Which gives me a dataframe with indices present in the array.

    A  B
0   5  1
1   6  2
2   3  3
4   4  5
7   7  8
8  12  9

Now I want all the rows which are not present in the array index, row index which i want is [3,5,6,9] I am trying to do something like this but it gives me an error.

df.iloc[~loc]

How can I do this?

A: import pandas as pd import numpy as np df = pd.DataFrame({'A' : [5,6,3,4,4,5,6,7,12,13], 'B' : [1,2,3,5,5,6,7,8,9,10,]}) array = np.array([0,1,2,4,7,8]) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) test: def g(df, array): return df[~df.index.isin(array)] df1 = pd.DataFrame({'A' : [5,6,3,4,4,5,6,7,12,13], 'B' : [1,2,3,5,5,6,7,8,9,10,]}) array1 = np.array([0,1,2,4,7,8]) print(pd.testing.assert_frame_equal(g(df1.copy(), array1.copy()), result, check_like=True)) html_A7: Problem:

I have a pandas dataframe like this..

df = pd.DataFrame({'A' : [5,6,3,4,4,5,6,7,12,13], 'B' :
     [1,2,3,5,5,6,7,8,9,10,]})

df

    A   B
0   5   1
1   6   2
2   3   3
3   4   5
4   4   5
5   5   6
6   6   7
7   7   8
8  12   9
9  13  10

and I have an array of indices

array = np.array([0,1,2,4,7,8])

Now I can subset the dataframe with the array indices like this

df.iloc[array]

Which gives me a dataframe with indices present in the array.

    A  B
0   5  1
1   6  2
2   3  3
4   4  5
7   7  8
8  12  9

Now I want all the rows which are not present in the array index and odd, row index which i want is [3,5,9] I am trying to do something like this but it gives me an error.

df.iloc[~loc]

How can I do this?

A: import pandas as pd import numpy as np df = pd.DataFrame({'A' : [5,6,3,4,4,5,6,7,12,13], 'B' : [1,2,3,5,5,6,7,8,9,10,]}) array = np.array([0,1,2,4,7,8]) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) test: def g(df, array): return df[np.bitwise_and(~df.index.isin(array),df.index%2==1)] df1 = pd.DataFrame({'A' : [5,6,3,4,4,5,6,7,12,13], 'B' : [1,2,3,5,5,6,7,8,9,10,]}) array1 = np.array([0,1,2,4,7,8]) print(pd.testing.assert_frame_equal(g(df1.copy(), array1.copy()), result, check_like=True)) 2-shot: Problem: Given: d = { 'High': [954, 953, 952, 955, 956, 952, 951, 950, ] } df = pandas.DataFrame(d) I want to add another column which is the max at each index from the beginning. For example the desired column would be: 'Max': [954, 954, 954, 955, 956, 956, 956, 956] I tried with a pandas rolling function but the window cannot be dynamic it seems Code: import pandas as pd d = { 'High': [954, 953, 952, 955, 956, 952, 951, 950, ] } df = pd.DataFrame(d) ### BEGIN SOLUTION df['Max'] = df.High.cummax() ### END SOLUTION result = df Problem: I have df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) id stuff val 0 A 12 1 1 B 23232 2 2 A 13 -3 3 C 1234 1 4 D 3235 5 5 B 3236 6 6 C 732323 -2 I'd like to get a running sum of val for each id, so the desired output looks like this: id stuff val cumsum 0 A 12 1 1 1 B 23232 2 2 2 A 13 -3 -2 3 C 1234 1 1 4 D 3235 5 5 5 B 3236 6 8 6 C 732323 -2 -1 This is what I tried: df['cumsum'] = df.groupby('id').cumsum(['val']) and df['cumsum'] = df.groupby('id').cumsum(['val']) This is the error I get: ValueError: Wrong number of items passed 0, placement implies 1 code: import pandas as pd df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) ### BEGIN SOLUTION df['cumsum'] = df.groupby('id')['val'].transform(pd.Series.cumsum) ### END SOLUTION print(df) ans=df Problem: I have a pandas dataframe like this.. df = pd.DataFrame({'A' : [5,6,3,4,4,5,6,7,12,13], 'B' : [1,2,3,5,5,6,7,8,9,10,]}) and I have an array of indices array = np.array([0,1,2,4,7,8]) Now I can subset the dataframe with the array indices like this df.iloc[array] Which gives me a dataframe with indices present in the array. A B 0 5 1 1 6 2 2 3 3 4 4 5 7 7 8 8 12 9 Now I want all the rows which are not present in the array index, row index which i want is [3,5,6,9] I am trying to do something like this but it gives me an error. df.iloc[~loc] code: import pandas as pd df = pd.DataFrame({'A' : [5,6,3,4,4,5,6,7,12,13], 'B' : [1,2,3,5,5,6,7,8,9,10,]}) array = np.array([0,1,2,4,7,8]) ### BEGIN SOLUTION [insert] ### END SOLUTION print(result) def g(df, array): return df[~df.index.isin(array)] df1 = pd.DataFrame({'A' : [5,6,3,4,4,5,6,7,12,13], 'B' : [1,2,3,5,5,6,7,8,9,10,]}) array1 = np.array([0,1,2,4,7,8]) print(pd.testing.assert_frame_equal(g(df1.copy(), array1.copy()), result, check_like=True)) 99 I have a DataFrame... >>> df = pd.DataFrame({ ... 'letters' : ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c'], ... 'is_min' : np.zeros(9), ... 'numbers' : np.random.randn(9) ... }) is_min letters numbers 0 0 a 0.322499 1 0 a -0.196617 2 0 a -1.194251 3 0 b 1.005323 4 0 b -0.186364 5 0 b -1.886273 6 0 c 0.014960 7 0 c -0.832713 8 0 c 0.689531 I would like to set the 'is_min' col to 1 if 'numbers' is the minimum value by column 'letters'. I have tried this and feel that I am close... >>> df.groupby('letters')['numbers'].transform('idxmin') 0 2 1 2 2 2 3 5 4 5 5 5 6 7 7 7 8 7 dtype: int64 I am having a hard time connecting the dots to set the val of 'is_min' to 1. *100* I have a dataset based on different weather stations, stationID | Time | Temperature | ... ----------+------+-------------+------- 123 | 1 | 30 | 123 | 2 | 31 | 202 | 1 | 24 | 202 | 2 | 24.3 | 202 | 3 | NaN | ... And I would like to remove 'stationID' groups, which have more than a certain number of NaNs. For instance, if I type: **>>> df.groupby('stationID')** then, I would like to drop groups that have (at least) a certain number of NaNs (say 30) within a group. As I understand it, I cannot use dropna(thresh=10) with groupby: **>>> df2.groupby('station').dropna(thresh=30)** *AttributeError: Cannot access callable attribute 'dropna' of 'DataFrameGroupBy' objects...* So, what would be the best way to do that with Pandas?