如何反转熊猫数据框列中的所有列表?

时间:2021-05-31 00:18:26

标签: python pandas

我有一个数据框,其中有一列填充了不同的列表。我想反转列中的每个列表。

我想要的例子:

我想要这个 df:

 index       x_val
 1           [1,2,3,4,5]
 2           [2,3,4,5,6]

变成这样:

 index       x_val
 1           [5,4,3,2,1]
 2           [6,5,4,3,2]

我尝试了以下代码:

 df['x_val'] = df['x_val'].apply(lambda x: x.reverse())

我得到了这个:

 index       x_val
 1           nan
 2           nan

我做错了什么?

2 个答案:

答案 0 :(得分:0)

两种情况:

案例 1

如果 List 属于 int type,构成 object typex_val

df = pd.DataFrame({
    'index':[1,2],
    'x_val':[[1,2,3,4,5], [2,3,4,5,6]]
})

代码

df['x_val'] = df['x_val'].apply(lambda x: list(reversed(x)))
df

案例 2

如果 x_val 列是 object 类型的 str。 (将使用单个字符串,如果实际上字符串是多字符的,则考虑将其转换为整数列表,然后使用案例 1 的代码)。

d="""index|x_val
1|[1,2,3,4,5]
2|[2,3,4,5,6]"""
df=pd.read_csv(StringIO(d), sep='|', engine='python')

代码

df['x_val'] = df['x_val'].apply(lambda x: '['+x[-2:0:-1]+']')
df

输出

    index   x_val
0   1       [5,4,3,2,1]
1   2       [6,5,4,3,2]

答案 1 :(得分:0)

@Uts 完全适用于案例 1。对于案例 2,任何 2 位(或更多)数字都将被转置,因为它们被视为字符串而不是表示为字符串的分隔整数值。

请参阅下面的案例 2b 以拆分和反转表示为字符串的整数列表。

import pandas as pd

print('Case 1 - x_val = lists of int')
df = pd.DataFrame({
     'index':[1,2,3],
     'x_val':[[1,2,3,4,5], [2,3,4,5,6], [6,7,8,9,10]]
})
print(df)
df['x_val'] = df['x_val'].apply(lambda x: list(reversed(x)))
print(df)

print('\nCase 2 - x_val = strings, string values will be reversed')
df = pd.DataFrame({
    'index':[1,2,3],
    'x_val':['[1,2,3,4,5]', '[2,3,4,5,6]', '[6,7,8,9,10]']
})
print(df)
df['x_val'] = df['x_val'].apply(lambda x: '['+x[-2:0:-1]+']')
print(df)

print('\nCase 2b - x_val = strings')
df = pd.DataFrame({
    'index':[1,2,3],
    'x_val':['[1,2,3,4,5]', '[2,3,4,5,6]', '[6,7,8,9,10]']
})
print(df)
df['x_val'] = df['x_val'].apply(lambda x: '['+','.join(el for el in 
    reversed(x[1:-1].split(',')))+']')
print(df)

输出:

Case 1 - x_val = lists of int
   index             x_val
0      1   [1, 2, 3, 4, 5]
1      2   [2, 3, 4, 5, 6]
2      3  [6, 7, 8, 9, 10]
   index             x_val
0      1   [5, 4, 3, 2, 1]
1      2   [6, 5, 4, 3, 2]
2      3  [10, 9, 8, 7, 6]

Case 2 - x_val = strings, string values will be reversed
   index         x_val
0      1   [1,2,3,4,5]
1      2   [2,3,4,5,6]
2      3  [6,7,8,9,10]
   index         x_val
0      1   [5,4,3,2,1]
1      2   [6,5,4,3,2]
2      3  [01,9,8,7,6]

Case 2b - x_val = strings
   index         x_val
0      1   [1,2,3,4,5]
1      2   [2,3,4,5,6]
2      3  [6,7,8,9,10]
   index         x_val
0      1   [5,4,3,2,1]
1      2   [6,5,4,3,2]
2      3  [10,9,8,7,6]