我有一个数据框,其中有一列填充了不同的列表。我想反转列中的每个列表。
我想要的例子:
我想要这个 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
我做错了什么?
答案 0 :(得分:0)
两种情况:
如果 List
属于 int type
,构成 object type
列 x_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
如果 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]