I got it to work! I defined a separate function, and put it into df['col_1'].apply().
Not the most elegant, but it worked. I'm also curious how people on this mailing list would do it. Cheers! On Sun, Feb 21, 2021 at 9:21 AM C W <tmrs...@gmail.com> wrote: > I do want to follow up, if I may. In Ming's example, > > a = 2342 > b = int("".join(map(lambda x: str((int(x)-3)%10) ,list(str(a))))) > > What's the best approach to apply to a dataframe column, rather than just > one value? Here's my attempt using df[col_1''].apply(), > df['col_1'].apply(lambda:a int("".join(map(lambda x: str((int(x)-3)%10) > ,list(str(a)))))) > > Thanks! > > On Sun, Feb 21, 2021 at 9:12 AM C W <tmrs...@gmail.com> wrote: > >> Thanks so much everyone, I appreciate it! >> >> Ming, your solution is awesome. More importantly, very clear explanations >> on how and why. So, I appreciate that. >> >> Thanks again, cheers! >> >> Mike >> >> On Sun, Feb 21, 2021 at 12:08 AM <2qdxy4rzwzuui...@potatochowder.com> >> wrote: >> >>> On 2021-02-20 at 20:49:15 -0800, >>> Dan Stromberg <drsali...@gmail.com> wrote: >>> >>> > On Sat, Feb 20, 2021 at 7:13 PM Ming <m...@pgp.cool> wrote: >>> > >>> > > I just wrote a very short code can fulfill your needs: >>> > > >>> > > a = 2342 >>> > > b = int("".join(map(lambda x: str((int(x)-3)%10) ,list(str(a))))) >>> > > >>> > I tend to favor plenty of temporary variables with descriptive names, >>> but >>> > this is indeed short. >>> > >>> > Apart from that, you may find that using a generator expression is >>> shorter >>> > and clearer than map+lambda. It should allow to additionally >>> eliminate the >>> > list conversion. >>> > >>> > So in the terse form you've got there, it'd be more like: >>> > b = int(''.join(str((int(x) - 3) % 10) for x in str(a)) >>> > >>> > But in real life, I'd try to use descriptive variable names for some >>> of the >>> > subexpressions in that. This makes reading and debugging simpler, >>> which is >>> > important because the maintenance phase of software is almost always >>> much >>> > longer and costly than the development phase. And although you could >>> do a >>> > generator expression for each of the different parts of (int(x) - 3) % >>> 10, >>> > I kinda like having a named function for just that piece. >>> > >>> > So maybe: >>> > def rot_3(character): >>> > """Convert to int, subtract 3 and mod 10.""" >>> > digit = int(character) >>> > assert 0 <= digit <= 9 >>> > return (digit - 3) % 10 >>> > >>> > >>> > def descriptive_minus_three_caesar(input_number): >>> > """Convert to a -3 caesar cypher on an integer.""" >>> > string_number = str(input_number) >>> > rotated_digits = (rot_3(character) for character in >>> string_number) >>> > output_string = ''.join(str(digit) for digit in rotated_digits) >>> > output_number = int(output_string) >>> > return output_number >>> >>> >>> descriptive_minus_three_caesar('38') >>> 5 >>> >>> The problem is underspecified, and the examples are lacking, but based >>> on the phrase "each digit" and the examples that contain a 3, I'd prefer >>> to see "38" become "05." >>> -- >>> https://mail.python.org/mailman/listinfo/python-list >>> >> -- https://mail.python.org/mailman/listinfo/python-list